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 :

GNU Sed, espace de travail et chainage de commandes.


Sujet :

Shell et commandes GNU

  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 GNU Sed, espace de travail et chainage de commandes.
    Coucou tout le monde

    J'ai un petit souci avec la commande gnu "sed"...

    Mon problème est comment faire en sorte, dans le cas d'un chainage de commandes ( ...;...;...; ), que chaque commande ou groupe de commandes travaille uniquement sur le dernier filtrage, en somme l'output tel qu'il serait affiché (ou le pattern space courant ?), et non sur le fichier d'entrée ou le premier filtrage... Mes essais avec les "buffers" de sed se sont avérés infructueux...

    Je donne un petit exemple concret :

    soit un fichier "txt.txt" dont voici le contenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     l1
     x1
     l2
     x2
     l3
     xt
     l4
     xp
     l5
     xs
     l6
     x+
     l7
     x7
     l8
     x8
     l9
     x9
    que je dois transformer en :

    Citation Envoyé par output
    xt xp
    xs x+
    ma ligne de commande sed qui fonctionne, mais dont je ne dois pas avoir plus d'une instance à la fois est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n "/l3/,/l7/I!d;/x./!d;p" txt.txt |sed -n "N;s/\n//;p"
    je souhaite qu'elle ait une forme proche de cette ligne qui évidemment ne produit pas le résultat escompté même quand j'y ai ajouté une étiquette et des accolades, et faute d'une maitrise totale sur la question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n "/l3/,/l7/I!d;/x./!d;N;s/\n//;p" txt.txt
    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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ sed -n '/l3/,/l7/{/x/p}' plop | sed 'N;s/\n//'
     xt xp
     xs x+

  3. #3
    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 zipe31 et merci pour la réponse

    Cependant, il ne faut pas que je redirige la sortie avec "|"... une seule et unique instance de sed doit tout faire... dans la mesure du possible...

    Merci

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

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

    D'abord, ce qui attire l'oeil c'est que tu fais des doubles-négations.
    Si tu mets l'option -n, pas la peine de détruire (d) mais p est nécessaire.
    Si tu ne mets pas l'option -n, p est inutile mais d est nécessaire.

    Ensuite, pour répondre à ta question, il faut filouter ou jongler avec le buffer, car sed ne peut pas travailler le fichier d'entrée et retravailler le fichier de sortie simultanément.

    Ici, on peut mettre en mémoire les x...., puis utiliser les références arrières pour supprimer les sauts de lignes (1 sur 2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^l3/,/^l7/{/^x/H};${g;s/\n\([^\n]*\)\n\([^\n]*\)/\n\1 \2/g;s/\n//;p}'
    Et s'il n'y a pas deux lignes à regrouper ? Et bien il écrira la dernière ligne x seule.

  5. #5
    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 Flodelarab

    C'est Super, ta réponse m'aide à y voir plus clair, merci beaucoup beaucoup

    Pour les combinaisons -n/d je savais que c'était pas approprié, mais gnu sed me disait qu'il manque une commande et sur l'instant je voyais pas quoi mettre d'autre, car je voulais bien séparer chaque étape ( ;...;...; ).

    Cependant, je ne cerne pas encore tout à fait le fonctionnement de sed, car quand j'enchaine les instructions, il semble bien travailler sur le résultat du traitement qui précède chaque nouvelle instruction. Est-ce un fonctionnement normal ou un effet de bord ? Et donc pour bien faire, est-ce qu'il faut systématiquement que j'imbrique les instructions avec des accolades ? S'il n'y avait pas eu ce problème avec la commande "N" je n'aurais rien vu.

    J'ai également une autre question. Est-ce qu'on peut faire utiliser le "hold buffer" comme un "input stream" par sed au lieu que tout soit lu sur une seule ligne ?

    Encore merci

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    il semble bien travailler sur le résultat du traitement qui précède chaque nouvelle instruction.
    Oui mais quand tu fais un N, c'est une nouvelle ligne qui arrive. Pas ce qui précède.

    Est-ce un fonctionnement normal ou un effet de bord ?
    C'est tout à fait normal.
    Quand tu demandes une nouvelle ligne, il la prend en entrée sans lui appliquer ton script.


    Est-ce qu'on peut faire utiliser le "hold buffer" comme un "input stream" par sed au lieu que tout soit lu sur une seule ligne ?
    Non. Tu as un espace pour travailler et un espace pour retenir.
    Mmais selon ton sed, tu peux faire une boucle. C'est pas une mauvaise idée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ sed '/^x/!d;:z;N;s/\n[^x].*//;t z;s/\n/ /' monfichier
    x1 x2  
    xt xp  
    xs x+  
    x7 x8  
    x9
    Le saut t est conditionnel (il existe aussi inconditionnel b et l'opposé T). Il saute si la substitution a marché (Ici, suppression de la ligne inintéressante).

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 374
    Par défaut
    Bonjour,

    Juste pour la bonne habitude concernant l'accolade fermante (pour un bloc de commande), il est conseillé de mettre un séparateur ";" entre la dernière commande du bloc et l'accolade fermante.
    Cela ne mange pas de pain et au moins cela fonctionne sur la majorité des sed.

  8. #8
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Merci beaucoup Flodelarab, tu as été d'une grande aide
    Salut disedorgue, message reçu. Merci à toi et à zipe31 pour vos interventions


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

Discussions similaires

  1. [FLASH 8] Agrandir la taille de l'espace de travail
    Par p0Kep0K dans le forum Flash
    Réponses: 5
    Dernier message: 12/02/2007, 08h54
  2. Le quadruplet "espace de travail" commun au deux écrans
    Par Ekinoks dans le forum Matériel
    Réponses: 19
    Dernier message: 13/12/2006, 21h51
  3. Fond d'écran diffèrent sur un espace de travail sous Xfc4
    Par Olivier Regnier dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 04/12/2006, 22h02
  4. Réponses: 2
    Dernier message: 13/01/2006, 16h11
  5. linker 2 projets inclus dans un espace de travail
    Par petdelascar dans le forum C
    Réponses: 2
    Dernier message: 12/01/2006, 20h02

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