SHELL-Commande sed ne supprime pas les lignes

Résolu
Bonjour,

En shell, le code suivant :

sed -n '/error/d' monfichier.txt

ne marche pas : les lignes contenant 'error' ne sont pas supprimées

Merci pour votre aide

4 réponses

  1. Modérateur
    Salut,

    Pour comprendre, bonne lecture ici

    lami20j@debian-acer:~$ cat plop
    aaaa
    error
    bbbb
    error aaa
    cccc error
    dddd
    lami20j@debian-acer:~$ sed -n '/error/d' plop
    lami20j@debian-acer:~$ sed -e '/error/d' plop
    aaaa
    bbbb
    dddd
    lami20j@debian-acer:~$ cat plop
    aaaa
    error
    bbbb
    error aaa
    cccc error
    dddd
    lami20j@debian-acer:~$ sed -e '/error/d' plop > plop.tmp
    lami20j@debian-acer:~$ cat plop
    aaaa
    error
    bbbb
    error aaa
    cccc error
    dddd
    lami20j@debian-acer:~$ cat plop.tmp 
    aaaa
    bbbb
    dddd
    lami20j@debian-acer:~$ sed -i.orig '/error/d' plop
    lami20j@debian-acer:~$ cat plop
    aaaa
    bbbb
    dddd
    lami20j@debian-acer:~$ cat plop.orig
    aaaa
    error
    bbbb
    error aaa
    cccc error
    dddd

    1. Merci pour toutes tes explications.
      J'ai cru qu'on pouvait le faire sans passer par un fichier temporaire.
      Merci bien ;)
    2. Modérateur
      Re,

      J'ai cru qu'on pouvait le faire sans passer par un fichier temporaire.
      Oui, on peut. C'était le dernier exemple avec l'option -i
      Regarde attentivement ;-)
      En fait le fichier original est sauvegardé avec l'extension .orig

      lami20j@debian-acer:~$ sed -i.orig '/error/d' plop  
      lami20j@debian-acer:~$ cat plop  
      aaaa  
      bbbb  
      dddd  
      lami20j@debian-acer:~$ cat plop.orig  
      aaaa  
      error  
      bbbb  
      error aaa  
      cccc error  
      dddd
    3. Salut,

      ça ne fonctionne pas de mon côté : l'option -i n'est pas reconnue (illegal option)...

      Ca marche bien en faisant :

      sed -e '/error/d' plop_temp.txt > plop.txt
      rm plop_temp.txt
  2. Modérateur
    Salut,

    l'option -i n'est pas reconnue (illegal option)...

    Tu es sur quel système?
    Tu as quelle version de sed ?
    Chez moi j'ai
    lami20j@debian-acer:~$ sed --version  
    GNU sed version 4.2.1


    On peut le faire avec perl alors

    lami20j@debian-acer:~$ cat plop  
    aaaa  
    error  
    bbbb  
    error aaa  
    cccc error  
    dddd  
    lami20j@debian-acer:~$ perl -ni.orig -e 'print unless /error/' plop  
    lami20j@debian-acer:~$ cat plop  
    aaaa  
    bbbb  
    dddd  
    lami20j@debian-acer:~$ cat plop.orig  
    aaaa  
    error  
    bbbb  
    error aaa  
    cccc error  
    dddd
    1. Modérateur
      Re,

      Ou avec une combinaison grep et echo

      lami20j@debian-acer:~$ cat plop
      aaaa
      error
      bbbb
      error aaa
      cccc error
      dddd
      lami20j@debian-acer:~$ var=$(grep -v error plop) && echo "$var" > plop
      lami20j@debian-acer:~$ cat plop
      aaaa
      bbbb
      dddd
      1. la commande
        sed --version
        ne marche pas non plus... bizarre

        Mais tes deux autres solutions (perl et grep+echo) marchent parfaitement, avec une préférence pour la dernière car je n'ai pas de fichier à supprimer ensuite.

        Encore merci ;)
        1. Modérateur
          Re,

          De rien ;-)

          avec une préférence pour la dernière car je n'ai pas de fichier à supprimer ensuite.
          Il suffit d'enlever .orig de la commande perl et il n'y aura plus de fichier à supprimer.
          Toutefois, quand on n'est pas sur de résultat il faut penser faire une sauvegarde de fichier d'origine
          A savoir que .orig est-une extension crée par moi, tu peux mettre n'importe quoi .bak, .old, .ancien, .blabla

          Voici sans sauvegarde de fichier original (la dernière commande montre qu'il n'y a pas d'autres fichiers à part plop)

          lami20j@debian-acer:~$ cat plop
          aaaa
          error
          bbbb
          error aaa
          cccc error
          dddd
          lami20j@debian-acer:~$ perl -ni -e 'print unless /error/' plop 
          lami20j@debian-acer:~$ cat plop
          aaaa
          bbbb
          dddd
          lami20j@debian-acer:~$ cat plop.orig
          cat: plop.orig: No such file or directory
        2. ajoute l'option -i