logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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:50]
Hypathie créée
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [28/07/2014 17:30]
Hypathie [Commandes indiquant en elle-même un adressage sed]
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 sedet 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 page 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==== 
 +^  ^                       ^ 
 +|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>​ 
 +
 +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 
 +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>​ 
 +
 +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=== 
  
utilisateurs/hypathie/tutos/sed-par-la-methode-structuraliste.txt · Dernière modification: 13/11/2014 09:31 par Hypathie

Pied de page des forums

Propulsé par FluxBB