i
), d'ajout (a
) et de changement (c
), fort heureusement, par défaut, l'affichage sur la sortie standard du tampon de travail de sed est annulé.Ce n'est bien sûr pas le cas pour la commande de suppression
-s
.Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
“Notre dette des uns aux autres, infiniment, dans une chaîne sans fin ni frontière, dans l’espace comme dans le temps. Cette dette dont la conscience nous fera accueillir l’étrange et l’étranger, l’inconnu comme l’imprévu lorsqu’ils frapperont inopinément à nos portes.
A condition cependant que nous ayons appris à vivre en vérité. Et que, par conséquent, nous n’ayons pas renoncé à savoir.”
Michel Foucault
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
L'éditeur de flux sed est lancé en ligne de commandes avec la commande sed.
Il ne faut pas confondre la commande sed reconnue par le shell (qui lance le programme sed) avec les commandes internes du programme sed.
Par défaut (sans option) sed traite le flux d'entrée et affiche sur la sortie, non seulement le flux d'entrée qu'elle a lu ligne par ligne, mais aussi ce qu'elle a fait sur certaine ligne.
Le flux d'entrée peut être ce qui lui est transmis par un pipe en ligne de commandes ou un fichier.
cmd[cat|echo|ls|...] fichier[repertoire] | sed [options] cmd_de_sed
ou
sed [options] cmd_de_sed fichier
-J'appelle grammaire du programme sed les règles qui gèrent la syntaxe global d'une ligne de commandes sed relativement aux commandes internes de sed.
En effet, la syntaxe de l'adressage et le choix des options dépendent du choix des commandes internes.
Par conséquent :
1) toutes les options “lues” par le shell qui lance sed, ne sont pas toutes associables entre elles selon les commandes internes utilisées.
2) certains types d'adressage ne fonctionnent qu'avec certaines commandes de sed.
3) toutes les commandes internes ne sont pas toutes associables entre elles.
Cette grammaire se résume ainsi :
[options] /adressage/cmd_de_sed [options_cmd_de_sed]
Ce que j'appelle là “options_cmd_de_sed” est appelé selon la documentation “drapeaux”, ou encore “options”. Elle dépend de la connaissance des commandes de sed.
→ La compréhension de la documentation et le fonctionnement global de sed sont facilités lorsque l'on maîtrise un double rapport d'implications :
[options]
⇔ cmd_de_sed
;/adressages/
⇔ cmd_de_sed
Cette association détermine les possibilités de combinaison des options de la commande sed.
sed -rne '/adressage/cmd_de_sed' fichier
Soit le fichier nommé “sed-options” :
Il est vraiment idiot, se balade sur un vélo sans pédale, et porte ses sandales à son goulot. il veut pour adresse mail 127.0.0.1@lo
sed -rne '4p' sed-options
à son goulot.
On voit là que la commande (interne de sed)p
prévaut sur l'option sed-n
.
Dans l'exemple précédent l'option-e
et-r
sont inutiles, elles ne le sont plus pour l'exemple suivant :
sed -rne '/([[:digit:]].){3}[[:digit:]]@lo/p' -e '4p' sed-options
à son goulot. il veut pour adresse mail 127.0.0.1@lo
-r
ne s'utilisera pas avec la commande y
puisque la translittération n'utilise pas de E.R.-i
ne s'utilisera qu'avec les commandes qui transforment le flux d'entrée, donc elle ne s'utilisera pas avec les commandes de sed p
, l
, r
…
Lorsqu'on a besoin d'adresser au moyen d'une E.R. étendue, et de modifier réellement, il faut associer les options -r
et -i
.
La syntaxe est toujours -ri
, et non pas -ir.
On peut associer d'autres options, après -ri
sed -rine '/([[:digit:]].){3}[[:digit:]]@lo/d' sed-options
ou
sed -rien '/([[:digit:]].){3}[[:digit:]]@lo/d' sed-options
L'option-n
rendant le retour silencieux :
cat sed-options
Il est vraiment idiot, se balade sur un vélo sans pédale, et porte ses sandales à son goulot.
sed [options] -f script [-i] [fichier...]
Cette option permettant l'utilisation de script sed, elle va donc influer sur la grammaire globale de sed.
Les commandes internes de sed doivent être inscrites dans le script, ce qui influe sur la syntaxe d'appel des commandes internes. L'utilisation du tampon n'étant plus le même avec l'utilisation d'un script sed, l'effet de l'option-n
va changer.
Elle implique aussi la possibilité d'utiliser les commandes de sed mises au point principalement pour l'usage de scripts sed.
(Voir la troisième partie “scripts sed avancés”)
Le fait que les commandes internes soient dans un fichier (ou script sed) implique que l'encadrement des commande de sed par'
ou“
ne doit pas être utilisé.
Un adressage pour chaque commande :
/adressage1/cmd1_interne /adressage2/cmd2_interne ...
Un adressage pour plusieurs commandes :
Utilisation d'une commande spécifiquement utilisée avec les scripts sed : { }
.
/adressage1/{ cmd1_interne cmd2_interne ... }
-f
sans autres options :sed -f script-sed fichier
Script1 : /([[:digit:]].){3}[[:digit:]]@lo/p 4p
sed -rnf script1-sed sed-options
à son goulot. il veut pour adresse mail 127.0.0.1@lo
-f
avec d'autres options :/([[:digit:]].){3}[[:digit:]]@lo/a\bizarre ce Nono
Dès lors qu'on utilise l'option-f
, l'option-e
n'est plus utilisable puisque le script enchaîne les commandes en les plaçant chacune sur une ligne ;
Mais l'option-r
doit être utilisable puisqu'il peut y avoir dans le script sed une commande dont l'adressage est une E.R. étendue.
De même l'option-i
doit être utilisable puisque un script sed doit servir à modifier un fichier texte !
Ainsi :
sed -rf script2-sed -i sed-options
Pour visualiser, utilisation d'une commande d'affichage ( cat par exemple) même si -n
n'a pas été utilisée1)
Attention l'utilisation de l'option -n
est plus qu'inutile !
En l'utilisant, il ne resterait du fichier que ce qui lui aurait été ajouté.
La note ci-dessus en donne exemple.
cat sed-options
Il est vraiment idiot, se balade sur un vélo sans pédale, et porte ses sandales à son goulot. il veut pour adresse mail 127.0.0.1@lo bizarre ce Nono
-n
;
sed -rnf script2-sed -i sed-options
on obtient alors :
cat sed-options
bizarre ce Nono
La ligne de commandes de “script2-sed”, matche la ligne “il veut pour adresse mail 127.0.0.1@lo”, du fait de l'option -n
, ni la ligne qui correspond à la E.R, ni les autres lignes du fichier ne sont placées dans le tampon de travail de sed ; puis sed applique la commande d'ajout de “script2-sed” ; et inscrit enfin ce résultat dans le fichier “sed-options”.
par conséquent il ne reste plus dans le fichier que l'ajout “bizarre ce Nono”.
/adressages/
⇔ cmd_de_sed
- Sans adressage, sed applique chaque commande à l'intégralité des lignes du fichier à traiter.
Cela implique donc un rapport entre ce que fait une commande interne et le type d'adressage qu'il est possible d'utiliser pour telle commande.
Autrement dit, ce que permet une commande interne détermine les types d'adressages possibles, adressage simple ou double d'abord.
- De plus, certaines commandes indiquent en elles-mêmes, non pas le type d'adressage, mais un adressage précis, comme par exemple N
.
Ainsi :
s
il apparaît l'adressage du numéro d'occurrence sur une ligne.2)
- Par ailleurs, l'adressage étant tributaire des commandes internes, on recense deux caractères spéciaux d'adressage.
!
) $
).3)Il s'agit des adressages qui fonctionnent avec toutes les commandes de sed utilisables en ligne de commandes.
sed-options Il est vraiment idiot, se balade sur un vélo sans pédale, et porte ses sandales à son goulot. il veut pour adresse mail 127.0.0.1@lo
sed -rne '/([[:digit:]].){3}[[:digit:]]@lo/!p' sed-options
ou
sed -rne '$!p' sed-options
Il est vraiment idiot, se balade sur un vélo sans pédale, et porte ses sandales à son goulot.
sed -rne '$p' sed-options
il veut pour adresse mail 127.0.0.1@lo
$
désignant la dernière ligne;/
;/
, toutes les lignes qui correspondent à /expression régulière/
sont traitées .C'est une paire d'adresses simples séparées une virgule. Toutes les combinaisons sont possibles.
n,mcmd_sed
: l'analyseur de sed traite les lignes comprises entre les deux adresses, et celles des adresses aussi./ER1/,/ER2/
: l'analyseur de sed traite les lignes comprises délimitées par les E.R de début et de fin en prenant le nombre de lignes le plus large4)n,/ER/
: La plage est constituée à partir de la ligne numéro n
, jusqu'à la première ligne reconnue par le E.R./ER/,n
: La plage est constituée à partir de la première ligne vérifiant l'expression régulière jusqu'à la ligne de numéro n
.d et D | supprimer |
p et P | afficher avec -n |
= | afficher n° de ligne(s) |
y/…./…./ | translittération |
c\texte | changement de texte |
automne mon bel automne dans les vergers du fond du ciel les éperviers de tes yeux planent tes feuilles tes fruits, ta pomme et le cerf, et son brame à jamais aimés de l'homme en ton cheveu me donnent et des langueurs et son adieu
sed -n '/.*,[[:space:]]/,10p' sed-cmd
tes fruits, ta pomme et le cerf, et son brame à jamais aimés
sed '/tes/,10d' sed-cmd
automne mon bel automne dans les vergers du fond du ciel les éperviers de l'homme en ton cheveu me donnent et des langueurs et son adieu
sed '1,$=' sed-cmd
1 automne 2 mon bel automne 3 dans les vergers 4 du fond du ciel 5 les éperviers 6 de tes yeux planent 7 tes feuilles 8 tes fruits, ta pomme 9 et le cerf, et son brame 10 à jamais aimés 11 de l'homme 12 en ton cheveu 13 me donnent 14 et des langueurs 15 et son adieu
sed '2,$!y/a/A/' sed-cmd
Automne mon bel automne dans les vergers du fond du ciel les éperviers de tes yeux planent tes feuilles tes fruits, ta pomme et le cerf, et son brame à jamais aimés de l'homme en ton cheveu me donnent et des langueurs et son adieu
sed -e '3,$c\ fleuve Léthé\ en ton grand coeur\ devient Vestale\ ' sed-cmd
automne mon bel automne fleuve Léthé en ton grand coeur devient Vestale
i\texte | insérer du texte |
a\texte | ajouter du texte |
sed '1i\Ton sentiment comme atmosphère' sed-cmd
Ton sentiment comme atmosphère automne mon bel automne dans les vergers du fond du ciel les éperviers de tes yeux planent tes feuilles tes fruits, ta pomme et le cerf, et son brame à jamais aimés de l'homme en ton cheveu me donnent et des langueurs et son adieu
sed '1a\ ' sed-cmd
automne mon bel automne dans les vergers du fond du ciel les éperviers de tes yeux planent tes feuilles tes fruits, ta pomme et le cerf, et son brame à jamais aimés de l'homme en ton cheveu me donnent et des langueurs et son adieu
s/motif/substitut/[indicateur] fichier
ou
cmd | s/motif/substitut/[indicateur]
s/motif/substitut/ -> si motif = une regexp -> alors subtitut = une chaîne de caractère
Pour Regexp
On peut utiliser la syntaxe habituelle, ou la syntaxe étendue avec l'optionsed -r
.
Voir : sed-et-les-expressions-rationnelles
s/expression1/expression2/[indicateur]
echo "aaaa BBB cCcC # 12345" > ~/sed1.txt
sed -i 's+ +\n+g' ~/sed1.txt && cat sed1.txt
aaaa BBB cCcC # 12345
echo "aaaa BBB cCcC # 12345" | sed 's+ +\n+g'
echo "aaaa BBB cCcC # 12345" | sed 's/ /\n/g'
echo "aaaa BBB cCcC # 12345" | sed 's_ _\n_g'
g | global : toutes les occurrences |
\n | indicateur de sous-chaîne |
w | écrire les modifications effectuées dans un fichier |
p | afficher la ligne modifiée |
e | exécution d'une commande |
& | chaîne à remplacer |
(\n) | sous-chaîne |
&
: Représente la chaîne à remplacer.
Si le signe &
est présent dans le motif de remplacement, alors, il sera substitué par le motif de recherche en entier.
aaaa BBB titi cCcC # 12345 BBB titi cCcC titi BBB /coucou/titi
sed 's/[0-9][0-9]*$/[&]/' sed1.txt
aaaa BBB cCcC # [12345] BBB titi cCcC
sed -re 's/titi/& grosminet/' -e\ '/titi/!d' -e\ 's/(BBB|cCcC)//' -e\ '/^ /d' -e\ '/^\/.*/d' -i\ sed1.txt
cat sed1.txt
titi grosminet titi grosminet
n
est le numéro de champ d'une partie du motif de recherche, chaque partie du motif de recherche étant délimitée ainsi \(sous-motif\)
.
sed -e '2s/\(titi\) \(grosminet\)/\2 \1/g' sed1.txt
titi grosminet grosminet titi
La commande s
supporte les adressages universaux.
Elle permet en plus de nouveaux types d'adressage.
1) 'n,/regexp/s/chaineA/chaineB'
n
est un nombre entier.
On remplace chaîneA par chaîneB de la ligne n
à la ligne comportant /regexp/.
AAAA 2 fraise 3 BBB orange AAAA 6 cerise BBB 1 abricot 9 AAAA pomme BBB 5 poire
sed '2,/cerise/s/[[:digit:]]/GAGA/' sed1.txt
AAAA 2 fraise GAGA BBB orange AAAA GAGA cerise BBB 1 abricot 9 AAAA pomme BBB 5 poire
2) '/regexp/ns/chaîneA/chaîneB/'
sed '/orange/,5s/[[:digit:]]/GAGA/' sed1.txt
AAAA 2 fraise GAGA BBB orange AAAA GAGA cerise BBB GAGA abricot GAGA AAAA pomme BBB 5 poire
n
n'arrêtera pas la substitution.
sed '/[[:digit:]]/,3s/[[:digit:]]/GAGA/' sed1.txt
Cette ligne ne remplacera pas un chiffre par “GAGA” de la première ligne où il y a un chiffre à la ligne 3.
AAAA GAGA fraise GAGA BBB orange AAAA GAGA cerise BBB GAGA abricot GAGA AAAA pomme BBB GAGA poire
echo "lalalala" | sed -e 's/la/li/2'
lalilala
Par exemple, pour matcher une chaîne constituée de deux chaînes égales séparées par un retour à la ligne, du fichier essai :
abcd abcd coucou coucou
sed -r 'N;s/^(.*)\n\1$/X/g' essai
X coucou coucou
first~step Match every step' th line starting with line first.
Remplaçons “first” et step” par “n” et “m” qui sont toujours des nombres !
L'expression n ~ m
ou n~m
signifie simplement :
” la E.R matche toutes les n
ième ligne(s) d'un fichier et cela en sautant un nombre de ligne égal à un écart (~) qui est lui-même égal, à la différence entre le nombre m
avec la première ligne du fichier (c'est-à-dire la position ordinal 1). On connaît donc le nombre de ligne sautée en faisant toujours m - 1
.“
Et si n
est égal à zéro, alors le E.R. match toutes les m
ièmes lignes à partir de la ligne m
et saute m
- 1 ligne(s).
1 ~ 2
: matche les lignes impaires : 1ière, 3ième, 5ième, etc.m
(m
= 2), il y a 1. Il sera sauté 1 ligne non-matchée et cela à partir de la ligne n°1 (n
= 1). Donc la sélection concerne la première ligne et saute 1 ligne, matche la 3ième ligne et saute 1 ligne, etc.2~3
: matche les lignes 2 ; 5 ; 8 ; 11m
= 3) à la première ligne du fichier, il y a deux lignes (3-1=2), et cela commence à la deuxième ligne (n
= 2). Donc la deuxième ligne est matchée, deux lignes sont sautées (3ième et 4 ième), la 5 ième est matchée, etc.m
= 5 ).sed '1~2 s_.*[coucou]_OK_' essai-tilde
OK/1 /titi/coucou/2 OK/3 /tutu/coucou/4 OK/5 /nono/coucou/6 OK/7 /lili/coucou/8 OK/9 /fofo/coucou/10 OK/11 /bibi/coucou/12 OK/13 /sisi/coucou/14 OK/15
sed '2~3 s_.*[coucou]_OK_' essai-tilde
/toto/coucou/1 OK/2 /tati/coucou/3 /tutu/coucou/4 OK/5 /nono/coucou/6 /lulu/coucou/7 OK/8 /fifi/coucou/9 /fofo/coucou/10 OK/11 /bibi/coucou/12 /zaza/coucou/13 OK/14 /baba/coucou/15
sed '10~5 s_.*[coucou]_OK_' essai-tilde
/toto/coucou/1 /titi/coucou/2 /tati/coucou/3 /tutu/coucou/4 /nani/coucou/5 /nono/coucou/6 /lulu/coucou/7 /lili/coucou/8 /fifi/coucou/9 OK/10 /dodu/coucou/11 /bibi/coucou/12 /zaza/coucou/13 /sisi/coucou/14 OK/15
sed '0~5 s_.*[coucou]_OK_' essai-tilde
/toto/coucou/1 /titi/coucou/2 /tati/coucou/3 /tutu/coucou/4 OK/5 /nono/coucou/6 /lulu/coucou/7 /lili/coucou/8 /fifi/coucou/9 OK/10 /dodu/coucou/11 /bibi/coucou/12 /zaza/coucou/13 /sisi/coucou/14 OK/15
i
), d'ajout (a
) et de changement (c
), fort heureusement, par défaut, l'affichage sur la sortie standard du tampon de travail de sed est annulé.-s
.$
de commandes sed, avec $
des E.R., et le caractère ^
placé sur une commande pour signifier “première ligne”, n'existe pas !