• la commande sed

      sed [-n] action [fichier1 fichier2 ... fichierx]
      sed [-n] -e action1 [-e action2 ...] [fichier1 fichier2 ... fichierx]
      sed -f script-sed [fichier1 fichier2 ... fichierx]

       

      Les actions spécifiées sont exécutées sur chaque ligne du ou des fichiers. Le résultat du traitement est affiché sur la sortie standard. Si plusieurs actions sont spécifiées sur la ligne de commande, chacune doit être précédée de l’option -e.

      La commande sed ne modifie pas le fichier d’origine sauf si elle est exécutée avec l’option -i.


      Syntaxe d’une action :


      [adresse[,adresse]] commande [arguments]

       

      Une action est syntaxiquement composée de :

      • Une partie adresse qui permet de spécifier sur quelles lignes doit s’effectuer la commande.
      • La commande à exécuter.
      • Les arguments de la commande.

      Syntaxe d’une adresse :

      Type d’adresse Lignes traitées
      Aucune adresse Toutes les lignes
      Adresses de type 1
      n Ligne n.
      $ Dernière ligne.
      /ERb/ Lignes correspondant à l’expression régulière
      Adresses de type 2
      n1, n2 Ligne n1 jusqu’à ligne n2.
      /ERb1/,/ERb2/ La première ligne traitée sera la première trouvée correspondant à ERb1. Le traitement se poursuivra sur toutes les lignes jusqu’à ce que sed rencontre une ligne correspondant à ERb2. Cette dernière sera également traitée.

      Syntaxe de la commande :

      Commande Argument Type d’adresse supportée (maximum) Signification
      d Aucun 2 Ne pas afficher les lignes spécifiées (delete).
      p Aucun 2 Afficher les lignes spécifiées (print).
      s /ERb/remplacement/[g] 2 Effectuer une substitution sur les lignes spécifiées (substitute). Le caractère optionnel "g" indique si la substitution doit être globale sur les lignes.
      w fichier 2 Ecrire les lignes spécifiées dans un fichier (write).
      = Aucun 1 Afficher le numéro de la ligne spécifiée.
      Dans les commandes ci-dessous, l’antislash rend le caractère "saut de ligne" invisible, ce qui permet de pouvoir spécifier plusieurs lignes de texte. Le dernier saut de ligne n’est pas masqué et représente la fin de la commande.
      a\ texte\[entrée]
      texte\[entrée]
      texte [entrée]
      1 Ajouter les lignes de texte après chaque ligne spécifiée (add).
      i\ texte\[entrée]
      texte\[entrée]
      texte [entrée]
      1 Insérer les lignes de texte avant chaque ligne spécifiée (insert).
      c\ texte\[entrée]
      texte\[entrée]
      texte [entrée]
      2 Remplacer les ligne spécifiées par les lignes de texte (change).
      Négation de la commande
      !commande La commande s’exécutera sur toutes les lignes sauf celles spécifiées dans l’adresse.

      Utilisation de sed en ligne de commande

      Exemples avec le fichier depts2012.txt

       

      cat depts2012.txt
      
      REGION  DEP   CHEFLIEU  TNCC  NCC         NCCENR
      82      01    01053     5     AIN         Ain
      22      02    02408     5     AISNE       Aisne
      ...
      04      974   97411     0     LA REUNION  La Réunion
      06      976   97608     0     MAYOTTE     Mayotte
      

      La commande d (delete)

      La commande d permet de ne pas afficher à l’écran les lignes sélectionnées par la partie adresse.

       

      Exemple :

      Ne pas afficher les lignes contenant les caractères de a à h (en minuscule)

       

      $ sed ‘/[a-h]/d’ depts2012.txt


      REGION  DEP     CHEFLIEU        TNCC    NCC     NCCENR
      82      01      01053   5       AIN     Ain
      73      46      46042   2       LOT     Lot
      $

      La commande p (print)

      La commande p permet d’afficher à l’écran les lignes sélectionnées par la partie adresse. Par défauf, sed affiche également tout le contenu du fichier. Pour modifier ce comportement, il faut utiliser l’option -n.

       

      Exemple :

      Afficher les lignes 1 à 4. Par défaut, sed affiche en plus tout le contenu du fichier. Les lignes demandées apparaissent donc en double.

       

      $ sed ’1,4p’ depts2012.txt


      REGION  DEP     CHEFLIEU        TNCC    NCC     NCCENR
      REGION  DEP     CHEFLIEU        TNCC    NCC     NCCENR
      82      01      01053   5       AIN     Ain
      82      01      01053   5       AIN     Ain
      22      02      02408   5       AISNE   Aisne
      22      02      02408   5       AISNE   Aisne
      83      03      03190   5       ALLIER  Allier
      83      03      03190   5       ALLIER  Allier
      93      04      04070   4       ALPES-DE-HAUTE-PROVENCE Alpes-de-Haute-Provence
      93      05      05061   4       HAUTES-ALPES    Hautes-Alpes
      93      06      06088   4       ALPES-MARITIMES Alpes-Maritimes
      ….
      $

       

      L’option -n permet de ne pas afficher le reste du fichier.

       

      $ sed -n ’1,4p’ depts2012.txt


      REGION  DEP     CHEFLIEU        TNCC    NCC     NCCENR
      82      01      01053   5       AIN     Ain
      22      02      02408   5       AISNE   Aisne
      83      03      03190   5       ALLIER  Allier
      $

      La commande w (write)

      La commande w permet d’écrire dans un fichier les lignes sélectionnées par la partie adresse. Comme pour la commande p, sed affiche également tout le contenu du fichier à l’écran. Pour modifier ce comportement, il faut utiliser l’option -n.

       

      Exemple :

      Stocker dans un fichier "depts3x" toutes les villes dont le code postal commence par 3 et dans le fichier "depts6x" toutes les villes dont le code postal commence par 6.

       

      $ sed -n -e ‘/3[0-9]\{4\}/w depts3x’ -e ‘/6[0-9]\{4\}/w depts6x’ depts2012.txt
      $ cat depts3x


      91      30      30189   2       GARD    Gard
      73      31      31555   3       HAUTE-GARONNE   Haute-Garonne

      82      38      38185   5       ISERE   Isère
      43      39      39300   2       JURA    Jura
      $ cat depts6x
      22      60      60057   5       OISE    Oise
      25      61      61001   5       ORNE    Orne

      42      68      68066   2       HAUT-RHIN       Haut-Rhin
      82      69      69123   2       RHONE   Rhône
      $

      Négation d’une commande (!)

      Le caractère ! placé devant une commande permet d’exécuter cette dernière sur toutes les lignes sauf sur celles correspondant à la partie adresse.

       

      Exemple :

      Ne pas afficher les lignes contenant les caractères de a à h (en minuscule)

       

      $ sed -n ‘/[a-h]/!p’ depts2012.txt


      REGION  DEP     CHEFLIEU        TNCC    NCC     NCCENR
      82      01      01053   5       AIN     Ain
      73      46      46042   2       LOT     Lot
      $

      La commande s (substitution)

      La commande s permet de substituer une chaine de caractères par une autre sur les lignes sélectionnées par la partie adresse.

      Pour substituer des noms de fichiers avec la commande sed, utiliser le pipe ‘|’ comme séparateur à cause du slash ‘/’ dans les noms de fichiers.

       

      $ sed -i "s|/fichier1|/fichier2|g" maListeDeFichiers


      Premier exemple :


      Remplacer toutes les chaines contenant ‘-et-’ ou ‘-ET-’ par ‘ & ‘

       

      $ sed -n ‘/-et-/p’ depts2012.txt


      24      28      28085   1       EURE-ET-LOIR    Eure-et-Loir
      53      35      35238   1       ILLE-ET-VILAINE Ille-et-Vilaine

      11      77      77288   0       SEINE-ET-MARNE  Seine-et-Marne
      73      82      82121   0       TARN-ET-GARONNE Tarn-et-Garonne
      $

       

      $ sed -e ‘s/-et-/ \& /g’ -e ‘s/-ET-/ \& /g’ depts2012.txt | sed -n ‘/ \& /p’


      24      28      28085   1       EURE & LOIR     Eure & Loir
      53      35      35238   1       ILLE & VILAINE  Ille & Vilaine

      11      77      77288   0       SEINE & MARNE   Seine & Marne
      73      82      82121   0       TARN & GARONNE  Tarn & Garonne
      $

       

      Second exemple :


      Travailler sur le contenu d’une variable.

       

      $ arg=fic1,fic2,fic3
      $ echo $arg
      fic1,fic2,fic3
      $ echo $arg | sed 's/,/ /g' # On remplace les virgules par des espaces
      fic1 fic2 fic3
      $ liste_arg=$(echo $arg | sed 's/,/ /g')
      $ echo $liste_arg
      fic1 fic2 fic3
      $ for argt in $liste_arg
      > do
      > echo $argt
      > done
      fic1
      fic2
      fic3
      $

       

      Troisième exemple :


      Le caractère "&" utilisée dans la partie remplacement représente la chaine correspondant à l’expression régulière.

       

      $ tail depts2012.txt
      11      91      91228   5       ESSONNE Essonne
      11      92      92050   4       HAUTS-DE-SEINE  Hauts-de-Seine

      04      974     97411   0       LA REUNION      La Réunion
      06      976     97608   0       MAYOTTE Mayotte
      $ tail depts2012.txt | sed ‘s/.*/|&|/’
      |11     91      91228   5       ESSONNE Essonne|
      |11     92      92050   4       HAUTS-DE-SEINE  Hauts-de-Seine|

      |04     974     97411   0       LA REUNION      La Réunion|
      |06     976     97608   0       MAYOTTE Mayotte|
      $

       

      Toutes les chaines ont été encadrées par des pipes "|"

       

      Quatrième exemple :


      Récupérer les codes postaux et les noms des départements (en majuscule) afin d’effectuer une mise en forme particulière.
      Utilisation de la mémorisation grâce aux caractères \( \) afin de les réafficher avec \1 et \2.

       

      $ tail depts2012.txt
      11      91      91228   5       ESSONNE Essonne
      11      92      92050   4       HAUTS-DE-SEINE  Hauts-de-Seine

      04      974     97411   0       LA REUNION      La Réunion
      06      976     97608   0       MAYOTTE Mayotte

       

      $ tail depts2012.txt | sed "s/^[0-9]\{2\}[ \t]*[0-9]\{2,3\}[ \t]*\([0-9]\{5\}\)[ \t]*[0-9][ \t]*\([-A-Z_\. ']\{1,\}\)[ \t]*.\{1,\}$/Code postal : \1\tDepartement : \2/"
      Code postal : 91228     Departement : ESSONNE
      Code postal : 92050     Departement : HAUTS-DE-SEINE

      Code postal : 97411     Departement : LA REUNION
      Code postal : 97608     Departement : MAYOTTE
      $

       

      Cinquième exemple :


      Exemples détaillés de l’option g dans la commande de substitution s.

       

      $ arg=val1,val2,val3,val4
      $ echo $arg
      val1,val2,val3,val4

       

      Remplacement de la globalité des virgules par des espaces grâce à l’option g.

       

      $ echo $arg | sed ‘s/,/ /g’
      val1 val2 val3 val4

       

      Sans l’option g, seule la première virgule rencontrée est remplacée par un espace.

       

      $ echo $arg | sed ‘s/,/ /’
      val1 val2,val3,val4

       

      Le chiffre 1 permet le remplacement de la première virgule rencontrée. Identique à la commande précédente.

       

      $ echo $arg | sed ‘s/,/ /1′
      val1 val2,val3,val4

       

      Le chiffre 3 permet le remplacement de la troisième virgule rencontrée.

       

      $ echo $arg | sed ‘s/,/ /3′
      val1,val2,val3 val4

      Script sed

      Exemple :


      $ nl script.sed
      1  1d
      2  2i\
      3  ————————\
      4  Liste des departements :\
      5  ————————
      6  s/^[0-9]\{2\}[ \t]*[0-9]\{2,3\}[ \t]*\([0-9]\{5\}\)[ \t]*[0-9][ \t]*\([-A-Z_\. ']\{1,\}\)[ \t]*.\{1,\}$/Code postal : \1\tDepartement : \2/
      7  s/^[0-9]\{2\}[ \t]*[0-9][A-B][ \t]*\([0-9][A-B][0-9]\{3\}\)[ \t]*[0-9][ \t]*\([-A-Z_\. ']\{1,\}\)[ \t]*.\{1,\}$/Code postal : \1\tDepartement : \2/
      8  $a\
      9  —————\
      10  Fin de la liste\
      11  —————
      $

      • Ligne 1 : Suppression de la première ligne du fichier.
      • Ligne 2 : Affichage du contenu des lignes 3 à 5 du script avant la ligne 2 du fichier.
      • Ligne 6 : Mise en forme des données du fichier
      • Ligne 7 : Identique à la ligne 6 mais avec la prise en compte des départements de La Corse
      • Ligne 8 : Affichage du contenu des lignes 9 à 11 du script après la dernière ligne ($) du fichier.

      $ sed -f script.sed depts2012.txt
      ————————
      Liste des departements :
      ————————
      Code postal : 01053     Departement : AIN
      Code postal : 02408     Departement : AISNE
      Code postal : 12202     Departement : AVEYRON
      Code postal : 14118     Departement : CALVADOS
      Code postal : 29232     Departement : FINISTERE
      Code postal : 30189     Departement : GARD
      Code postal : 97608     Departement : MAYOTTE
      —————
      Fin de la liste
      —————
      $

 

Aucun commentaire

 

Laissez un commentaire