IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[sed] Réutiliser une ligne avec des '\n'


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut [sed] Réutiliser une ligne avec des '\n'
    saluuuuuuuut

    Je n'utilise pas beaucoup sed, et dès que je sors des sentiers classiques, ça se complique un peu. En effet, pour éviter un enchainement de pipeline et redirection, il faut manipuler les buffers, et ça, je ne maitrise pas.
    Mon problème est assez simple à comprendre: après quelques commandes, mon "pattern space" contient une ligne unique avec des \n (' a \n b \n c \n d \n e \n f \n g \n h \n i \n j \n k \n l \n m \n') et mon objectif est de réutiliser cette ligne comme s'il s'agissait d'un flux de plusieurs lignes.
    Voilà, si ça vous parle...

    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par minnesota Voir le message
    mon objectif est de réutiliser cette ligne comme s'il s'agissait d'un flux de plusieurs lignes.
    Voilà, si ça vous parle...
    Dis comme ça pas trop

    Tu veux utiliser le flux en sortie ou dans le buffer ?

    Le plus simple serait de nous donner un exemple concret de ce que tu veux faire...

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    La déscription que tu donnes correspond au fonctionnement du drapeau M. Sinon, il faut se débrouiller autrement.

    Vois la différence entre ces deux substitutions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo -e "foo\nbar" | sed 'N;s/^.*$//M'
     
    bar
    $ echo -e "foo\nbar" | sed 'N;s/^.*$//'
    $

  4. #4
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Ah, salut vous deux
    Merci de prendre ce nouvel appel... vous m'avez déjà aidé y'a quelques jours...

    Le drapeau M m'a semblé être une excellente piste, j'ai testé et j'ai pas réussi à me débrouiller avec en utilisant qu'un seul sed, bien qu'il me semble comprendre son utilité. De même avec P, rien à faire.

    Aussi désolé, j'aurai dû donner un exemple complet dès le départ, ce que je vais tenter de réparer maintenant.

    alors, la problématique est la suivante :

    Supposons une unique ligne extrêmement simplifiée qui est :

    -1ptl- a, b, e, -c1- -c2- f, -c5- g, h, i, j, k, 5, m, n, o, 9, -c4- r, u, v, -c3- z, y -ptl2-

    La seule constance, c'est les "-ptl-" qui débute et termine chaque portion de ligne, le reste, que ce soit l'ordre ou la présence, est complètement aléatoire.

    L'objectif est de filtrer cette portion de ligne suivant les flags prioritaires du moment, et ainsi, à partir de la forme simplifiée, conserver uniquement h, m, 9, w, et z (mais c'est pas forcément disponible) et tout ce qui est entre "-", et donc supprimer tout le reste,

    ce qui donnerait :

    -1ptl- -c1- -c2- -c5- h, m, 9, -c4- -c3- z -ptl2-

    pour ce, voilà ce que j'ai fait et qui fonctionne avec gnu sed:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    str='-1ptl- a, b, e, -c1- -c2- f, -c5- g, h, i, j, k, 5, m, n, o, 9, -c4- r, u, v, -c3- z, y -ptl2-'
    echo $str|\
    sed -n 's/ /&\n/gp'|\
    sed -n '/h\|m\|9\|z\|w\|-[^-]\+-/H;${g;s/\n//g;s/, -ptl/ -ptl/;p};'
    Mon but est d'utiliser sed qu'une seule fois.

    Merci

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    T'es obligé d'utiliser sed ? Ici je privilégierais awk personnellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    idriss@ThinkPad-T420 ~ $ cat fichier.txt 
    -1ptl- a, b, e, -c1- -c2- f, -c5- g, h, i, j, k, 5, m, n, o, 9, -c4- r, u, v, -c3- z, y -ptl2-
    -1ptl- a, b, e, -c1- -c2- f, -c5- g,, i, j, k, 5, , n, m, o, 9, -c4- r, u, v, -c3- z, y -ptl2-
    idriss@ThinkPad-T420 ~ $ awk -F "(,| )+" '{str=""; for(i=1 ; i<=NF ; i++){if($i ~ "^-.+-$"){str=str""$i" "}else if($i ~ "^(h|m|9|w|z)$"){str=str""$i", "}} print str}' fichier.txt 
    -1ptl- -c1- -c2- -c5- h, m, 9, -c4- -c3- z, -ptl2- 
    -1ptl- -c1- -c2- -c5- m, 9, -c4- -c3- z, -ptl2- 
    idriss@ThinkPad-T420 ~ $
    J'ai considéré qu'il n'y avait pas de séparateur après une valeur entre tirets comme dans ton exemple (sinon ça aurait été encore plus simple).

    Cordialement,
    Idriss

  6. #6
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    salut ok.Idriss.

    Merci pour ta proposition, et effectivement, dans la mesure du possible, il faut que je reste sur sed.

    Celà dit ton code me sera certainement utile, car il y a à peine quelques minutes, je commençais à m'intéresser à "gnu awk".

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire la moyenne d'une ligne avec des colonnes non conjointes
    Par NewYork dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/12/2010, 10h06
  2. Suppression d'une ligne avec des colonnes vides
    Par fatima dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/11/2010, 14h38
  3. [WD-2003] le contraire de sauter une ligne avec des mots
    Par jessicaz dans le forum VBA Word
    Réponses: 21
    Dernier message: 28/04/2009, 08h50
  4. dessiner une ligne avec des point de coordonnées doubles
    Par tanguy.L dans le forum Débuter
    Réponses: 2
    Dernier message: 11/11/2008, 23h16
  5. Compléter une ligne avec des petits points "à la word"
    Par polemoss dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/05/2007, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo