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 →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [26/07/2014 13:57] Hypathie [Les rapport d'implication /adressages/ <=> commandes de sed] |
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [28/07/2014 17:56] Hypathie [Commandes de sed supportant les adressages universaux] |
||
---|---|---|---|
Ligne 18: | Ligne 18: | ||
L'éditeur de flux sed est lancé en ligne de commandes avec la commande sed.\\ | 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.\\ | + | Il ne faut pas confondre la commande sed reconnue par le shell (qui lance le programme sed) avec les commandes internes du programme sed((y ; s ; a\ ; i\ ; p ; d ; c\ ; w ; q ...))\\ |
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.\\ | 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. | + | Le flux d'entrée peut être ce qui lui est transmis par un pipe en ligne de commandes ou un fichier.\\ |
<code> | <code> | ||
- | cmd[cat|echo|ls|...] fichier[repertoire] | sed [options] cmd_de_sed | + | cmd[cat|echo|ls|...] fichier[repertoire]\ |
+ | | sed [options] cmd_de_sed | ||
</code> | </code> | ||
ou | ou | ||
Ligne 30: | Ligne 31: | ||
sed [options] cmd_de_sed fichier | sed [options] cmd_de_sed fichier | ||
</code> | </code> | ||
+ | |||
+ | En tant que commande lancée par le shell, sed possède des options : | ||
+ | |||
+ | * Les options sans implication avec les commandes internes de sed | ||
+ | |||
+ | ^ Options ^ Signification ^ | ||
+ | |'' --posix '' |Désactiver toutes les extensions GNU| | ||
+ | |''-u'', ''--unbuffered'' |Charger des quantités minimales de données\\ depuis les fichiers d'entrée\\ et libérer les tampons de sortie plus souvent| | ||
+ | |''--help'' |Afficher cette aide et sortir | | ||
+ | |''--version'' |Afficher les informations de version du logiciel | | ||
+ | |||
+ | * Les options sensibles aux commandes internes de sed | ||
+ | |||
+ | ^options ^significations ^ | ||
+ | |''-e'' |enchaîner plusieurs commandes | | ||
+ | |''-r'' |utiliser les expressions régulières étendues dans un script | | ||
+ | |''-n'' |mode silencieux : permet de ne rien modifier\\ associée au drapeau p (print)\\ (affichage sur la sortie standard) | | ||
+ | |''-f'' |Les commandes sont lues à partir d'un fichier préalablement rédigé. | | ||
+ | |''-i'' |Le fichier est édité sur place.| | ||
+ | |||
+ | |||
+ | |||
<note tip> | <note tip> | ||
+ | __**"Options sensibles"**__\\ | ||
- | -Les options concernent la ligne de commandes du programme sed et non les commandes de sed. | + | -J'appelle "options sensibles" celles qui s'utilisent en rapport aux commandes internes de sed, et dont l'usage réclame une connaissance de la "grammaire" de sed. |
- | -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. | + | -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.\\ | En effet, la syntaxe de l'adressage et le choix des options dépendent du choix des commandes internes.\\ | ||
Ligne 42: | Ligne 67: | ||
3) toutes les commandes internes ne sont pas toutes associables entre elles. | 3) toutes les commandes internes ne sont pas toutes associables entre elles. | ||
- | __Cette grammaire se résume ainsi :__ | + | __**Cette grammaire se résume ainsi** :__ |
<code> | <code> | ||
- | [options] /adressage/cmd_de_sed [options_cmd_de_sed] | + | sed [-n [-e commande] [-f script] [-i[.extension]]\ |
+ | [l [cesure]] rsu] [<commande>] [<fichier(s)>] | ||
</code> | </code> | ||
- | |||
- | //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 :\\ | -> 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 :\\ | ||
Ligne 63: | Ligne 87: | ||
</code> | </code> | ||
- | Soit le fichier nommé "sed-options" : | + | <code text sed-options> |
- | <code> | + | |
Il est vraiment idiot, | Il est vraiment idiot, | ||
se balade sur un vélo | se balade sur un vélo | ||
Ligne 217: | Ligne 240: | ||
</note> | </note> | ||
- | =====Les rapport d'implication /adressages/ <=> commandes de sed===== | + | =====Les rapports d'implication /adressages/ <=> commandes de sed===== |
<note tip> | <note tip> | ||
**Analyse de l'implication : ''/adressages/'' <=> ''cmd_de_sed'' | **Analyse de l'implication : ''/adressages/'' <=> ''cmd_de_sed'' | ||
Ligne 229: | Ligne 252: | ||
Ainsi : | Ainsi : | ||
- | - Toutes les commandes peuvent accepter un __//adressage simple//__, certaines autres accepteront en plus un __//adressage double//__. | + | - Certains adressages sont spécifiques à certaines commandes seulement. |
- | - Avec la commande ''y'' il apparaît __l'adressage du numéro d'occurrence__ sur une ligne.((Les deux derniers points seront précisés au paragraphe ci-après, "commandes en fonction de leur adressage".)) | + | - Avec la commande ''s'' il apparaît __l'adressage du numéro d'occurrence__ sur une ligne.((Les deux derniers points seront précisés au paragraphe ci-après, "commandes en fonction de leur adressage".)) |
- Par ailleurs, l'adressage étant tributaire des commandes internes, on recense deux caractères spéciaux d'adressage.\\ | - Par ailleurs, l'adressage étant tributaire des commandes internes, on recense deux caractères spéciaux d'adressage.\\ | ||
Ligne 237: | Ligne 260: | ||
</note> | </note> | ||
- | ====Rappel des types d'adressage ==== | + | ====Les adressages universaux ==== |
+ | Il s'agit des adressages qui fonctionnent avec toutes les commandes de sed utilisables en ligne de commandes. | ||
=== le caractère d'exclusion (!)=== | === le caractère d'exclusion (!)=== | ||
<code text sed-options> | <code text sed-options> | ||
- | sed-options | ||
Il est vraiment idiot, | Il est vraiment idiot, | ||
se balade sur un vélo | se balade sur un vélo | ||
sans pédale, et porte ses sandales | sans pédale, et porte ses sandales | ||
à son goulot. | à son goulot. | ||
- | il veut pour adresse mail 127.0.0.1@lo | ||
- | </code> | ||
- | |||
- | * Exemple : afficher la dernière ligne de "sed-options" | ||
- | |||
- | <code user> | ||
- | sed -rne '$p' sed-options | ||
- | </code> | ||
- | <code> | ||
il veut pour adresse mail 127.0.0.1@lo | il veut pour adresse mail 127.0.0.1@lo | ||
</code> | </code> | ||
Ligne 272: | Ligne 286: | ||
à son goulot. | à son goulot. | ||
</code> | </code> | ||
+ | ===le caractère d'adressage de dernière ligne ($)=== | ||
+ | * Exemple : afficher la dernière ligne de "sed-options" | ||
+ | |||
+ | <code user> | ||
+ | sed -rne '$p' sed-options | ||
+ | </code> | ||
+ | <code> | ||
+ | il veut pour adresse mail 127.0.0.1@lo | ||
+ | </code> | ||
+ | |||
===Adressage simple=== | ===Adressage simple=== | ||
Ligne 281: | Ligne 305: | ||
<note important> | <note important> | ||
__Attention avec l'adressage simple !__\\ | __Attention avec l'adressage simple !__\\ | ||
- | * Avec l'adressage simple par numéro de lignes, seule la ligne indiquée par le numéro est traitée. | + | * Avec l'adressage simple par numéro de ligne, seule la ligne indiquée par le numéro est traitée. |
* Avec l'adressage simple par l'encadrement ''/'', toutes les lignes qui correspondent à ''/expression régulière/'' sont traitées . | * Avec l'adressage simple par l'encadrement ''/'', toutes les lignes qui correspondent à ''/expression régulière/'' sont traitées . | ||
</note> | </note> | ||
- | ===Adressage double === | + | =====Commandes de sed supportant les adressages universaux===== |
+ | ^ ^ ^ | ||
+ | |i\texte |insérer du texte | | ||
+ | |a\texte |ajouter du texte | | ||
- | C'est une paire d'adresses simples séparées une virgule. Toutes les combinaisons sont possibles. | + | |
- | * deux numéro de ligne ''n,m**cmd_sed**'' : l'analyseur de sed traite les lignes comprises entre les deux adresses, et celles des adresses aussi.\\ | + | ==="i" : insertion avant la ligne d'adressage=== |
- | * deux encadrements ''/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 large((c'est-à-dire, si l'E.R. de début figure entre les deux adressages, il traite le plage la plus grande.)) | + | <code user> |
+ | sed -i '1i\Ton sentiment comme atmosphère' sed-cmd | ||
+ | </code> | ||
+ | <code user> | ||
+ | cat sed-cmd | ||
+ | </code> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | === "a" : ajout après l'adressage=== | ||
+ | <code user> | ||
+ | sed -e '1a\ ' -e '2,$s/^/ /' -i sed-cmd | ||
+ | </code> | ||
+ | <code user> | ||
+ | cat sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | ====Adressage double ==== | ||
+ | |||
+ | C'est une paire d'adresses simples séparées par une virgule. Toutes les combinaisons sont possibles. | ||
+ | * deux numéros de ligne ''n,m**cmd_sed**'' : l'analyseur de sed traite les lignes comprises entre les deux adresses, et celles des adresses aussi.\\ | ||
+ | * deux encadrements ''/ER1/,/ER2/'' : l'analyseur de sed traite les lignes délimitées par les //E.R// de début et de fin en prenant le nombre de lignes le plus large((c'est-à-dire, si l'E.R. de début figure entre les deux adressages, il traite le plage la plus grande.)) | ||
* combinaison ''n,/ER/'' : La plage est constituée à partir de la ligne numéro ''n'', jusqu'à la première ligne reconnue par le //E.R.// | * combinaison ''n,/ER/'' : La plage est constituée à partir de la ligne numéro ''n'', jusqu'à la première ligne reconnue par le //E.R.// | ||
* combinaison ''/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''. | * combinaison ''/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''. | ||
- | ====Études des commandes internes en fonction des adressages ==== | + | ====Les commandes de sed supportant les adressages universaux et l'adressage double==== |
+ | ^Commandes ^Significations ^ | ||
+ | |d |supprimer | | ||
+ | |p |afficher avec ''-n'' | | ||
+ | | = |afficher n° de ligne(s) | | ||
+ | |y/..../..../ | translittération | | ||
+ | |c\texte |changement de texte| | ||
+ | |||
+ | ===Préparation === | ||
+ | <code text 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 | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ===="p" : affichage ==== | ||
+ | <code user> | ||
+ | sed -n '/.*,[[:space:]]/,10p' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | tes fruits, ta pomme | ||
+ | et le cerf, et son brame | ||
+ | à jamais aimés | ||
+ | </code> | ||
+ | |||
+ | ===="d" : suppression ==== | ||
+ | <code user> | ||
+ | sed '/tes/,10d' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | ==== "=" numérotation==== | ||
+ | <code user> | ||
+ | sed '1,$=' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | ==== "y" : translittération==== | ||
+ | <code user> | ||
+ | sed '2,$!y/a/A/' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | ==== "c" : changement de texte==== | ||
+ | <code user> | ||
+ | sed -e '3,$c\ | ||
+ | fleuve Léthé\ | ||
+ | en ton grand coeur\ | ||
+ | devient Vestale\ | ||
+ | ' sed-cmd | ||
+ | </code> | ||
+ | <code> | ||
+ | automne | ||
+ | mon bel automne | ||
+ | fleuve Léthé | ||
+ | en ton grand coeur | ||
+ | devient Vestale | ||
+ | </code> | ||
+ | |||
+ | |||
+ | =====La commande "s"===== | ||
+ | ====Méthodes d'appel==== | ||
+ | <code> | ||
+ | s/motif/substitut/[options_de_s] fichier | ||
+ | </code> | ||
+ | ou | ||
+ | <code> | ||
+ | cmd | s/motif/substitut/[options_de_s] | ||
+ | </code> | ||
+ | |||
+ | >Voir : [[doc:systeme:sed#la-fonction-de-substitution-s]] | ||
+ | |||
+ | ====Détail : /motif/substitut/ ==== | ||
+ | <code user> | ||
+ | s/motif/substitut/ | ||
+ | -> si motif = une E.R | ||
+ | -> alors subtitut = une chaîne de caractère | ||
+ | </code> | ||
+ | |||
+ | >Pour //E.R// | ||
+ | >On peut utiliser la syntaxe habituelle, ou la syntaxe étendue avec l'option ''sed -r''. | ||
+ | >Voir : [[utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles]] | ||
+ | |||
+ | ====Détail : la ligne de commande "s"==== | ||
+ | <code c> | ||
+ | s/expression1/expression2/[options_de_s] | ||
+ | </code> | ||
+ | ===les séparateurs ( / )=== | ||
+ | <code user> | ||
+ | echo "aaaa BBB cCcC # 12345" > ~/sed1.txt | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | sed -i 's+ +\n+g' ~/sed1.txt && cat sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | aaaa | ||
+ | BBB | ||
+ | cCcC | ||
+ | # | ||
+ | 12345 | ||
+ | </code> | ||
+ | |||
+ | <note tip> | ||
+ | Tout cela revient au même ;-) | ||
+ | |||
+ | <code user> | ||
+ | echo "aaaa BBB cCcC # 12345" | sed 's+ +\n+g' | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | echo "aaaa BBB cCcC # 12345" | sed 's/ /\n/g' | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | echo "aaaa BBB cCcC # 12345" | sed 's_ _\n_g' | ||
+ | </code> | ||
+ | |||
+ | </note> | ||
+ | |||
+ | |||
+ | ====Détail : "options-de-s" ("flags")==== | ||
+ | |||
+ | ^ ^ ^ | ||
+ | |g | global : toutes les occurrences | | ||
+ | |n | la nième occurrence d'une ligne | | ||
+ | |p | afficher la ligne modifiée | | ||
+ | |w | écrire les substitutions effectuées dans un fichier | | ||
+ | |e | exécution d'une commande | | ||
+ | |I | ignorer la casse | | ||
+ | |M | correspondance de E.R.\\ (implémentation GNU, non portable) | | ||
+ | |||
+ | ===g ; n et p === | ||
+ | * substituer toutes les occurrences de motif | ||
+ | <code text sed-coincoin.txt> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | barbar | ||
+ | coincoin babar coincoin | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | sed 's/coincoin//g' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | barbar | ||
+ | babar | ||
+ | </code> | ||
+ | > Sans ''g'', seul le "coincoin" à gauche de "babar" aurait été substitué par un espace. | ||
+ | |||
+ | * Substituer l'occurrence d'une ligne | ||
+ | |||
+ | <code user> | ||
+ | sed '/babar/s/coin//3' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | barbar | ||
+ | coincoin babar coin | ||
+ | </code> | ||
+ | |||
+ | * Afficher sur la sortie standard la substitution : | ||
+ | <code user> | ||
+ | var="ligne1\nligne2\nligne3\nligne\nligne5" | ||
+ | </code> | ||
+ | <code user> | ||
+ | echo -e "$var" | sed '4 s/e/e4/p' | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | ligne1 | ||
+ | ligne2 | ||
+ | ligne3 | ||
+ | ligne4 | ||
+ | ligne4 | ||
+ | ligne5 | ||
+ | </code> | ||
+ | |||
+ | > Le doublon est dû à l'affichage du cache, auquel s'ajoute l'affichage de la substitution. | ||
+ | > Il faut utiliser l'option sed -n : | ||
+ | |||
+ | <code user>echo -e "$var" | sed -n '4 s/e/e4/p'</code> | ||
+ | |||
+ | ligne4 | ||
+ | |||
+ | === w écrire=== | ||
+ | <code user> | ||
+ | sed -n 's/barbar/babar/pw fichier-barbar' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | babar | ||
+ | </code> | ||
+ | <code user> | ||
+ | cat fichier-barbar | ||
+ | </code> | ||
+ | <code> | ||
+ | babar | ||
+ | </code> | ||
+ | |||
+ | === e : exécution d'une commande=== | ||
+ | <code user> | ||
+ | sed 's/barbar/date/e' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | lundi 28 juillet 2014, 12:32:20 (UTC+0200) | ||
+ | coincoin babar coincoin | ||
+ | </code> | ||
+ | |||
+ | ===I : ignorer la casse === | ||
+ | <code user> | ||
+ | var="COINcoin\nbabar\ncoinCOIN\nbabar\ncoincoin" | ||
+ | </code> | ||
+ | <code user> | ||
+ | echo -e "$var" | sed 's/coincoin/tointoin/Ig' | ||
+ | </code> | ||
+ | <code> | ||
+ | tointoin | ||
+ | babar | ||
+ | tointoin | ||
+ | babar | ||
+ | tointoin | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ====Les indicateurs spéciaux==== | ||
+ | ^ ^ ^ | ||
+ | |&|chaîne à remplacer| | ||
+ | |(\n)|sous-chaîne | | ||
+ | |||
+ | ===Le caractère & === | ||
+ | **''&''** : 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. | ||
+ | <code text sed1.txt> | ||
+ | aaaa | ||
+ | BBB titi | ||
+ | cCcC | ||
+ | # | ||
+ | 12345 | ||
+ | BBB | ||
+ | titi cCcC | ||
+ | titi BBB | ||
+ | /coucou/titi | ||
+ | </code> | ||
+ | |||
+ | * Entourer de crochet la chaîne "12345" | ||
+ | |||
+ | <code user> | ||
+ | sed 's/[0-9][0-9]*$/[&]/' sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | aaaa | ||
+ | BBB | ||
+ | cCcC | ||
+ | # | ||
+ | [12345] | ||
+ | BBB | ||
+ | titi cCcC | ||
+ | </code> | ||
+ | |||
+ | * Faire ensorte que le fichier "sed1.txt" ne comporte deux lignes "titi grominet" | ||
+ | <code user> | ||
+ | sed -re 's/titi/& grosminet/' -e\ | ||
+ | '/titi/!d' -e\ | ||
+ | 's/(BBB|cCcC)//' -e\ | ||
+ | '/^ /d' -e\ | ||
+ | '/^\/.*/d' -i\ | ||
+ | sed1.txt | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | cat sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | titi grosminet | ||
+ | titi grosminet | ||
+ | </code> | ||
+ | |||
+ | ===l'indicateur de sous-chaîne (\n) === | ||
+ | ''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\)''. | ||
+ | * Exemple inverser la deuxième ligne de "sed1.txt" | ||
+ | <code user> | ||
+ | |||
+ | </code> | ||
+ | sed -e '2s/\(titi\) \(grosminet\)/\2 \1/g' sed1.txt | ||
+ | <code> | ||
+ | titi grosminet | ||
+ | grosminet titi | ||
+ | </code> | ||
+ | |||
+ | ====Des adressages spéciaux==== | ||
+ | La commande ''s'' supporte les [[utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste?&#les-adressages-universaux|adressages universaux]].\\ | ||
+ | Elle permet en plus de nouveaux types d'adressage. | ||
+ | ===Remarque sur l'adressages mixtes : 'n,/E.R./' ou '/E.R./,n' === | ||
+ | |||
+ | __1) 'n,/E.R./s/chaineA/chaineB'__ | ||
+ | |||
+ | ''n'' est un nombre entier. | ||
+ | On remplace chaîneA par chaîneB de la ligne ''n'' à la ligne comportant /E.R./.\\ | ||
+ | |||
+ | * Préparation : fichier "sed1.txt | ||
+ | <code> | ||
+ | AAAA 2 fraise | ||
+ | 3 BBB orange | ||
+ | AAAA 6 cerise | ||
+ | BBB 1 abricot | ||
+ | 9 AAAA pomme | ||
+ | BBB 5 poire | ||
+ | </code> | ||
+ | |||
+ | * Substitution de la ligne n° 2 jusqu'à la ligne de chaîne "cerise" | ||
+ | <code user> | ||
+ | sed '2,/cerise/s/[[:digit:]]/GAGA/' sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | AAAA 2 fraise | ||
+ | GAGA BBB orange | ||
+ | AAAA GAGA cerise | ||
+ | BBB 1 abricot | ||
+ | 9 AAAA pomme | ||
+ | BBB 5 poire | ||
+ | </code> | ||
+ | |||
+ | __2) '/E.R./ns/chaîneA/chaîneB/'__ | ||
+ | |||
+ | * Substitution à partir de la chaîne "orange" jusqu'à la ligne n° 5 | ||
+ | |||
+ | <code user> | ||
+ | sed '/orange/,5s/[[:digit:]]/GAGA/' sed1.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | AAAA 2 fraise | ||
+ | GAGA BBB orange | ||
+ | AAAA GAGA cerise | ||
+ | BBB GAGA abricot | ||
+ | GAGA AAAA pomme | ||
+ | BBB 5 poire | ||
+ | </code> | ||
+ | |||
+ | <note important> | ||
+ | Il faut trois "genres d'objets". Car si /E.R./ d'adressage correspond à chaîne, alors l'indication ''n'' n'arrêtera pas la substitution. | ||
+ | <code user> | ||
+ | sed '/[[:digit:]]/,3s/[[:digit:]]/GAGA/' sed1.txt | ||
+ | </code> | ||
+ | > Cette ligne ne remplacera pas un chiffre par "GAGA" de la première ligne où il y a un chiffre à la ligne 3. | ||
+ | <code> | ||
+ | AAAA GAGA fraise | ||
+ | GAGA BBB orange | ||
+ | AAAA GAGA cerise | ||
+ | BBB GAGA abricot | ||
+ | GAGA AAAA pomme | ||
+ | BBB GAGA poire | ||
+ | </code> | ||
+ | </note> | ||
+ | |||
+ | === Adressage avec n° d'occurrence (fonctionne sur une ligne)=== | ||
+ | <code user> | ||
+ | echo "lalalala" | sed -e 's/la/li/2' | ||
+ | </code> | ||
+ | <code> | ||
+ | lalilala | ||
+ | </code> | ||
+ | |||
+ | ===Adressage du retour chariot === | ||
+ | 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 : | ||
+ | <code> | ||
+ | abcd | ||
+ | abcd | ||
+ | coucou coucou | ||
+ | </code> | ||
+ | <code user> | ||
+ | sed -r 'N;s/^(.*)\n\1$/X/g' essai | ||
+ | </code> | ||
+ | <code> | ||
+ | X | ||
+ | coucou coucou | ||
+ | </code> | ||
+ | |||
+ | === Adressage avec le tilde=== | ||
+ | <code text man sed> | ||
+ | first~step | ||
+ | Match every step' th line starting with line first. | ||
+ | </code> | ||
+ | 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.\\ En effet, de la première ligne du fichier à ''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 ; 11\\ L'écart sauté sera de 2 car de la position 3 (''m'' = 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. | ||
+ | * 10 ~ 5 : sélection des lignes 10 ; 15 ; 20 ; 25 etc. 5 - 1 = 4 : Il sera sauté 4 lignes non-matchées à partir de la ligne 10. | ||
+ | |||
+ | * 0~5 : sélection des lignes 5 ; 10 ; 15 etc.\\ m-1 = 5-1 = 4 lignes sautées, à partir de la cinquième ligne (''m'' = 5 ). | ||
+ | |||
+ | * Exemple 1: | ||
+ | <code user> | ||
+ | sed '1~2 s_.*[coucou]_OK_' essai-tilde | ||
+ | </code> | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | * Exemple 2 : | ||
+ | <code user> | ||
+ | sed '2~3 s_.*[coucou]_OK_' essai-tilde | ||
+ | </code> | ||
+ | <code> | ||
+ | /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 | ||
+ | </code> | ||
+ | * Exemple 3 : | ||
+ | <code user> | ||
+ | sed '10~5 s_.*[coucou]_OK_' essai-tilde | ||
+ | </code> | ||
+ | <code> | ||
+ | /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 | ||
+ | </code> | ||
+ | * Exemple 4 : | ||
+ | <code user> | ||
+ | sed '0~5 s_.*[coucou]_OK_' essai-tilde | ||
+ | </code> | ||
+ | <code> | ||
+ | /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 | ||
+ | </code> | ||
+ | |||
+ | =====Commandes indiquant en elle-même un adressage sed===== | ||
+ | |||
+ | ==== # : Commentaire (Aucune adresse autorisée)==== | ||
+ | Le caractère ''#'' (dièse) commence un commentaire et ce jusqu'à la fin de la ligne.\\ | ||
+ | Dans un script sed, il peut se trouver sur la même ligne qu'une commande, elle ne sera prise pour un commantaire.\\ | ||
+ | Si les deux premiers caractères d'un script sed sont "#n", l'option "-n" (no-autoprint) est alors forcée. | ||
+ | |||
+ | ====q quit : Quitter (une adresse autorisée)==== | ||
+ | Cette commande permet de quitter sed après le travail sur l'adressage en cours d'exécution.\\ | ||
+ | Elle est utile quand on utilise sed sur de gros fichiers.\\ | ||
+ | |||
+ | ===Exemple sans commande "q"=== | ||
+ | reprise du "sed-automn.txt" et script1 contenant : | ||
+ | <code> | ||
+ | 4,5p | ||
+ | 8!d | ||
+ | </code> | ||
+ | <code user> | ||
+ | sed -f script1 sed-automn.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | mon bel automne | ||
+ | dans les vergers | ||
+ | de tes yeux planent | ||
+ | </code> | ||
+ | |||
+ | > Dans ce cas, sed affiche de la ligne 4 à la ligne 5. | ||
+ | > Puis la commande d supprime tout sauf les lignes de p et la ligne traitée par d. | ||
+ | |||
+ | ===Utilisation de la commande ''q''=== | ||
+ | Reprise du fichier "sed-automn.txt" et script2 contenant : | ||
+ | <code> | ||
+ | # 4,5p | ||
+ | # 8!d | ||
+ | |||
+ | 6q;4,5p;8!d | ||
+ | </code> | ||
+ | |||
+ | <code user> | ||
+ | sed -nf script2 sed-automn.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | mon bel automne | ||
+ | dans les vergers | ||
+ | </code> | ||
+ | |||
+ | > Dans ce cas, la commande q adresse les 6 premières lignes dans la mémoire principale de sed, qui peut alors les utiliser une fois, donc pour une seule commande après q. | ||
+ | > En effet, si l'adressage de la commande suivante "déborde" de celui de la commande q, alors sed affiche la ligne que la commande q a adressé à la mémoire principale. | ||
+ | |||
+ | <code> | ||
+ | sed '2q;4,5p' sed-automn.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | Ton sentiment comme atmosphère | ||
+ | #la deuxième ligne est une ligne vide | ||
+ | </code> | ||
+ | |||
+ | > Utiliser sans adressage elle affiche la première ligne du fichier ; sed enregistre au moins une ligne pour traiter une commande sans adressage du fichier. | ||
+ | |||
+ | ====la commande n (next-line ) ==== | ||
+ | À ne pas confondre avec l'option de la ligne de commande sed.\\ | ||
+ | La commande ''n'' déplace l'adressage de l'espace de travail d'une ligne. | ||
+ | |||
+ | ===Affichage de lignes sans la commande n === | ||
+ | <code user> | ||
+ | echo -e "1A\n2B\n3C" | sed -ne '2p' | ||
+ | </code> | ||
+ | <code> | ||
+ | 2B | ||
+ | </code> | ||
+ | |||
+ | === Affichage de lignes avec la commande n=== | ||
+ | * adressage simple : | ||
+ | <code user> | ||
+ | echo -e "1A\n2B\n3C" | sed -n '2 {n;p}' | ||
+ | </code> | ||
+ | <code> | ||
+ | 3C | ||
+ | </code> | ||
+ | |||
+ | * adressage double : | ||
+ | <code user> | ||
+ | echo -e "1A\n2B\n3C\n3D" | sed -n '1,3 {n;p}' | ||
+ | </code> | ||
+ | <code> | ||
+ | 2B | ||
+ | 3D | ||
+ | </code> | ||
+ | |||
+ | ====la commande { } ==== | ||
+ | Elle permet d'indiquer un seul adressage pour plusieurs commandes.\\ | ||
+ | |||
+ | * Elle s'utilise en ligne de commande voir l'exemple de la commande précédemment considérée ; | ||
+ | |||
+ | sed [options] '/adressage/ {cmd1;cmd2;...}' | ||
+ | |||
+ | * Elle s'utilise aussi dans un script sed ; | ||
+ | <code> | ||
+ | adressage{ | ||
+ | cmd1 | ||
+ | cmd2 | ||
+ | ... | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | * Elle permet l'imbrication d'adressage ; | ||
+ | <code> | ||
+ | adressage1{ | ||
+ | adressage1A cmd1A | ||
+ | adressage1B cmd1B | ||
+ | ... | ||
+ | adressage2{ | ||
+ | cmd2A cmd2A | ||
+ | ... | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ====La commande r "fichier lu" (read) ==== | ||
+ | Elle adresse à sed un fichier et l'insère dans le fichier de destination. | ||
+ | |||
+ | sed '/adressage-pour fichier-modifié/ r fichier-mofifié | ||
+ | |||
+ | Il ne doit y avoir qu'un seul espace entre la commande et le nom du "fichier lu".\\ | ||
+ | Il faut donner le chemin absolu du "fichier lu" | ||
+ | si le terminal ne se trouve dans le répertoire parent de ce "fichier lu". | ||
+ | ===Préparation=== | ||
+ | * soit le fichier "sed-fich-lu.txt" : | ||
+ | <code> | ||
+ | texte du fichier lu | ||
+ | deuxième ligne | ||
+ | </code> | ||
+ | * soit le fichier "sed-coincoin.txt" : | ||
+ | <code> | ||
+ | coin | ||
+ | coin | ||
+ | foobar | ||
+ | barbar | ||
+ | </code> | ||
+ | |||
+ | ===Ajouter le contenu de "sed-fich-lu.txt" dans "sed-coincoin.txt"=== | ||
+ | <code user> | ||
+ | sed '1,3r sed-fich-lu.txt' sed-coincoin.txt | ||
+ | </code> | ||
+ | <code> | ||
+ | coin | ||
+ | texte du fichier lu | ||
+ | deuxième ligne fichier lu | ||
+ | coin | ||
+ | texte du fichier lu | ||
+ | deuxième ligne fichier lu | ||
+ | foobar | ||
+ | texte du fichier lu | ||
+ | deuxième ligne fichier lu | ||
+ | barbar | ||
+ | </code> | ||
+ | |||
+ | ====La commande w fichier ( write ) ==== | ||
+ | Écrit la ligne en cours de traitement dans le fichier spécifié à la suite de la commande "w".\\ | ||
+ | Le fichier sera créé, même si le traitement est nul en sortie.\\ | ||
+ | Tout comme la commande "r" (lecture), il ne doit y avoir qu'un seul espace entre la commande et le nom du fichier à créer.\\ | ||
+ | Si un fichier du même nom existe déjà, il sera écrasé sans avertissement ni confirmation et ce à chaque invocation du script.\\ | ||
+ | Si plusieurs instructions de la commande "w" sont appelées à écrire dans un même fichier depuis un script, chaque écriture est ajoutée à la fin du fichier. | ||
+ | |||
+ | ===créer un fichier avec sed et echo :=== | ||
+ | <code user> | ||
+ | echo "contenu d'un fichier créé" | sed 'w fichier-sed-cree' | ||
+ | </code> | ||
+ | <code> | ||
+ | contenu d'un fichier créé | ||
+ | </code> | ||
+ | <code user> | ||
+ | cat fichier-sed-cree | ||
+ | </code> | ||
+ | <code> | ||
+ | contenu d'un fichier créé | ||
+ | </code> | ||
+ | |||
+ | ---------- | ||
+ | <note tip> | ||
+ | **Toutes commandes présentées jusqu'ici,**\\ | ||
+ | [[utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste#les-commandes-de-sed-supportant-les-adressages-universaux|celles regroupées en fonction des adressages universaux]],\\ | ||
+ | [[utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste#la-commande-s|la commande ''s'']],\\ | ||
+ | et [[utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste#commandes-indiquant-en-elle-meme-un-adressage-sed|les commandes adressant en-elle-même un adressage à sed]],\\ | ||
+ | utilisent principalement le mécanisme suivant :\\ | ||
+ | |||
+ | > Lecture d'une ligne du fichier d'entrée dans l'espace de travail à laquelle est appliquée chaque commande du script séquentiellement. | ||
+ | > Lorsque la fin d'une ligne de commande sed est atteinte, la ligne enregistrée et travaillée est alors envoyée sur la sortie standard,\\ | ||
+ | > Puis l'espace de travail est effacé ; | ||
+ | > Autrement dit, __leur fonctionnement se base sur une utilisation simple du //"pattern space"//__. | ||
+ | |||
+ | __**La notion de "pattern space"**__\\ | ||
+ | |||
+ | C'est __la mémoire principale (tampon)__ qui permet à sed de travailler ; on la nomme aussi "espace de travail". C'est là que sont enregistrées les données.\\ | ||
+ | |||
+ | Mais sed possède __deux sortes de mémoire tampon__. La __deuxième est appelée "espace annexe" ou "hold space"__.\\ | ||
+ | Cette dernière est un espace mémoire où les données (la ou les ligne(s)) peuvent être enregistrées provisoirement.\\ | ||
+ | Certaines commandes permettent de modifier l'adressage des lignes tel qu'il est enregistré dans l'une de ces mémoires.\\ | ||
+ | D'autres, permettent aussi un échange de données d'une mémoire à l'autre.\\ | ||
+ | |||
+ | **Il reste à présenter :** | ||
+ | * Les commandes utilisant la mémoire annexe (h,H,g,G,x) | ||
+ | * Les commandes de tests faisant appel à des étiquettes (:,b,t,T) | ||
+ | </note> | ||
+ | ------------- | ||
- | ===Les commandes d'adressage simple=== | ||