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

Linux Discussion :

Commande sed - Ligne vide


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Points : 98
    Points
    98
    Par défaut Commande sed - Ligne vide
    Bonjour à tous,

    J'éprouve quelques difficulté avec la commande sed:

    - J'ai un fichier texte toto.txt:

    Motif_1
    blabla
    qsdq
    qsd
    qds

    Motif_2
    sfdsdf
    sdfs
    sf
    sdfsd

    ...

    Je voudrais récupérer dans un fichier titi.txt uniquement ce qui est compris entre le motif_1 et la ligne vide suivante. Mon code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sed -n '/'Motif_1'/,/^$/p' toto.txt > titi.txt
    Mais ce code me retourne la ligne du motif + la ligne suivante !
    Motif_1
    blabla

    Merci pour votre aide !

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Pourtant chez moi ça marche. Tu es bien sous Linux ? Les ranges (/pattern/,/pattern/) sont une extension Gnu, ça n'existe pas en sed standard.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    sous linux ça retourne ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Motif_1
    blabla
    qsdq
    qsd
    qds
    et je ne pense pas que c est ce qu'il veut.


    il veut peut etre récupérer que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    blabla
    qsdq
    qsd
    qds

  4. #4
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Bonjour,

    En utilisant sed, je vois pas comment faire sans un pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/'Motif_1'/,/^$/p' toto.txt | sed -n '/'Motif_1'/!p' > titi.txt
    Ce qui te retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    blabla
    qsdq
    qsd
    qds

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    Citation Envoyé par lavazavio Voir le message
    Bonjour,

    En utilisant sed, je vois pas comment faire sans un pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/'Motif_1'/,/^$/p' toto.txt | sed -n '/'Motif_1'/!p' > titi.txt
    Ce qui te retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    blabla
    qsdq
    qsd
    qds
    s'il le fait directement dans l'invite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/'Motif_1'/,/^$/p' toto.txt | sed -n '/'Motif_1'/\!p' > titi.txt

  6. #6
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Euh... oui, c'est pas ce que j'ai dit... ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    juste le \!p pour pas qu il soit interprété

  8. #8
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Que la commande soit passée directement dans le shell ou via un script, il ne faut pas de backslash.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    !p chez moi c est la derniere commande lancé commencant par p ... et elle est interprétée si je ne mets pas de backslash

  10. #10
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Je ne saisis pas trop ce que tu veux dire.
    Le sed du pipe (sed -n '/'Motif_1/!p') sert à supprimer la ligne Motif_1 => !p signifie : print les lignes différentes de Motif_1.
    p et !p fonctionnent sur le même principe que la distinction entre égalité ( = ) et différence ( != ).

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    quand tu tapes !p tu lances la derniere commande commençant par p, tout comme !! lance la derniere commande entrée.

    donc dans ton shell si tu as tapé une commande commençant par p avant et que tu tapes ça, ba il plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/'Motif_1'/,/^$/p' toto.txt | sed -n '/'Motif_1'/!p' > titi.txt
    donc rajouter un backslash avant n'est pas dérangeant et ça évite les surprises du genre

  12. #12
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Non, car il ne faut pas confondre commande shell et commande implémentée dans sed.
    Ici, p est une commande implémentée par sed qui signifie "print". La syntaxe de sed fait que p est bien reconnu comme commande interne de sed et non autre chose. Enfin, de la même façon que ici p est une commande interne à sed, !p est le contraire de la commande interne p de sed et il ne faut pas de backslash dans ce cas.

    Je comprends ton raisonnement mais tu mélanges commande shell et commande interne à sed.
    Pour t'en convaincre, je te laisse tester la commande sed avec ta syntaxe (\!p). Tu verras que sed va te retourner une erreur d'execution.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    => sed -n '/'Motif_1'/,/^$/p' toto.txt | sed -n '/'Motif_1'/!p' 
    sed -n '/'Motif_1'/,/^$/p' toto.txt | sed -n '/'Motif_1'/pwd'
    sed: -e expression #1, char 11: extra characters after command
     
    => sed -n '/'Motif_1'/,/^$/p' toto.txt | sed -n '/'Motif_1'/\!p'
    blabla
    qsdq
    qsd
    qds
    j ai bien dit en commande (dans l'invite)

    mais effectivement dans un shell ça plante


    petit dialogue de sourd

  14. #14
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Bon, on a tous les 2 raisons alors !
    Chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    user:~/Desktop$ sed -n '/'Motif_1'/,/^$/p' toto.txt | sed -n '/'Motif_1'/!p'
    blabla
    qsdq
    qsd
    qds
     
    user:~/Desktop$ sed -n '/'Motif_1'/,/^$/p' toto.txt | sed -n '/'Motif_1'/\!p'
    sed: -e expression n°1, caractère 10: commande inconnue: `\'

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    ouah surprenant ça, j'avoue ne pas trop comprendre
    une différence d'environnement probablement

    et j ai le meme résultat sous solaris

  16. #16
    Rédacteur
    Avatar de lavazavio
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 673
    Points : 2 412
    Points
    2 412
    Par défaut
    Bon comme ca, on saura que si un jour sed renvoie une erreur, ca sera peut-être parce qu'il faut (ou non) bloquer !p !

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    ouai
    sinon coincoin

Discussions similaires

  1. Commande sed, ligne trop longue
    Par zrobin dans le forum Unix
    Réponses: 1
    Dernier message: 12/07/2010, 18h45
  2. [Batch] Gestion de lignes vide avec la commande sed
    Par DeVit dans le forum Scripts/Batch
    Réponses: 18
    Dernier message: 20/10/2009, 19h06
  3. Commande sed : mon fichier de sortie est vide
    Par danyboy85 dans le forum Unix
    Réponses: 1
    Dernier message: 23/07/2009, 11h39
  4. extraire une partie de chaine avec une seule ligne de commande sed
    Par kinkichin dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 07/07/2009, 10h28
  5. La commande sed renvoie un fichier vide
    Par aaronw dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 29/09/2006, 11h46

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