-
la commande sed
- 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.
- 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 [-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 :
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,val4Remplacement de la globalité des virgules par des espaces grâce à l’option g.
$ echo $arg | sed ‘s/,/ /g’
val1 val2 val3 val4Sans l’option g, seule la première virgule rencontrée est remplacée par un espace.
$ echo $arg | sed ‘s/,/ /’
val1 val2,val3,val4Le 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,val4Le chiffre 3 permet le remplacement de la troisième virgule rencontrée.
$ echo $arg | sed ‘s/,/ /3′
val1,val2,val3 val4Script 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 —————
$$ 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
—————
$