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

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 [28/07/2014 18:16]
Hypathie [La commande s]
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [29/07/2014 12:43]
Hypathie [Les rapports d'implication options de sed <=> commandes de sed]
Ligne 20: Ligne 20:
 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 ...))\\ ​ 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 ​enregistre, mais aussi le résultat de son traitement.\\  
-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 par un fichier ​donné en argument.\\
  
   * Méthodes d'​appel :   * Méthodes d'​appel :
  
 <​code>​ <​code>​
-cmd[cat|echo|ls|...] fichier[repertoire]\ +cmd[cat|echo|ls|...] ​[fichier[repertoire]]\ 
- | sed [options] cmd_de_sed+ | sed [options] cmd_de_sed ​
 </​code>​ </​code>​
 ou ou
Ligne 58: Ligne 58:
 __**"​Options sensibles"​**__\\ ​ __**"​Options sensibles"​**__\\ ​
  
--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 "​options sensibles"​ celles ​dont l'utilisation dépend des 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.
Ligne 67: Ligne 67:
 1) toutes les options "​lues"​ par le shell qui lance sed, ne sont pas toutes associables entre elles selon les commandes internes utilisées.\\ ​ 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.\\ ​ 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.+3) toutes les commandes internes ne sont pas toutes associables entre elles.\\  
 +4) certaines commandes nécessitent la présence d'​autres commandes pour que leurs usages prennent sens.
  
 __**Cette grammaire se résume ainsi** :__ __**Cette grammaire se résume ainsi** :__
Ligne 79: Ligne 80:
   * 1) la mise en relation ''​[options]''​ <=> ''​cmd_de_sed''​ ;\\    * 1) la mise en relation ''​[options]''​ <=> ''​cmd_de_sed''​ ;\\ 
   * 2) ''/​adressages/''​ <=> ''​cmd_de_sed''​   * 2) ''/​adressages/''​ <=> ''​cmd_de_sed''​
-  * La compréhension globale de sed dépend ​ensuite simplement ​de la mise en relation de 1 et 2.  ​+  * 3) la mise en relation de différentes commandes 
 + 
 +La compréhension globale de sed dépend ​tout d'​abord ​de la mise en relation de 1 et 2.  ​
 </​note>​ </​note>​
  
Ligne 117: Ligne 120:
 <note tip> <note tip>
 La possibilité d'​utiliser telle où telle option dépend de la fonction des commandes de sed.\\ ​ La possibilité d'​utiliser telle où telle option dépend de la fonction des commandes de sed.\\ ​
-Ainsi l'​option ''​-r''​ ne s'​utilisera pas avec la commande ​''​y'' ​puisque la translittération n'​utilise pas de //E.R.//\\  +Ainsi l'​option ''​-r''​ ne s'​utilisera pas avec la commande ​"y" ​puisque la translittération n'​utilise pas de //E.R.//\\  
-L'​option ''​-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''​...+L'​option ''​-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".
 </​note>​ </​note>​
  
Ligne 148: Ligne 151:
 </​code>​ </​code>​
  
->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.\\+<note tip> 
 +Cette option permettant l'​utilisation de script sed, elle va donc influer sur la possibilité d'​utiliser conjointement d'​autres options ​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"​)//​ //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"​)//​
 +</​note>​
  
   * __**Éléments de syntaxe d'un script sed :**__   * __**Éléments de syntaxe d'un script sed :**__
Ligne 203: Ligne 208:
 /​([[:​digit:​]].){3}[[:​digit:​]]@lo/​a\bizarre ce Nono /​([[:​digit:​]].){3}[[:​digit:​]]@lo/​a\bizarre ce Nono
 </​code>​ </​code>​
->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 :+<note tip> 
 +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 !\\  
 +Cela se fait ainsi :
 <code user> <code user>
 sed -rf script2-sed -i sed-options sed -rf script2-sed -i sed-options
 </​code>​ </​code>​
 +</​note>​
 __Pour visualiser, utilisation d'une commande d'​affichage ( **cat** par exemple)__ même si ''​-n''​ n'a pas été utilisée((Lors de l'​utilisation d'un script sed sur un fichier, pour ce qui concerne les commandes d'​insertion (''​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''​.))\\ ​ __Pour visualiser, utilisation d'une commande d'​affichage ( **cat** par exemple)__ même si ''​-n''​ n'a pas été utilisée((Lors de l'​utilisation d'un script sed sur un fichier, pour ce qui concerne les commandes d'​insertion (''​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''​.))\\ ​
 //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.// //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.//
Ligne 317: Ligne 324:
 |a\texte |ajouter du texte | |a\texte |ajouter du texte |
  
- +===Préparation ​=== 
-==="​i"​ : insertion avant la ligne d'​adressage=== +<​code ​text sed-automn.txt>
-<​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 automne
 mon bel automne mon bel automne
Ligne 342: Ligne 342:
 et son adieu et son adieu
 </​code>​ </​code>​
 +
 +==="​i"​ : insertion avant la ligne d'​adressage===
 +
 +<code user>
 +sed '​1i\Ton sentiment comme atmosphère'​ sed-automn.txt
 +</​code>​
 +
 +>Le titre "Ton sentiment comme atmosphère"​ est ajouté sur la la sortie standard.
  
 === "​a"​ : ajout après l'​adressage=== === "​a"​ : ajout après l'​adressage===
 <code user> <code user>
-sed -e '1a\ ' -e '​2,​$s/​^/​ /' ​-i sed-cmd+sed -e '1a\ ' -e '​2,​$s/​^/​ /' sed-automn.txt
 </​code>​ </​code>​
 +
 +>Une ligne vide est ajoutée en deuxième ligne par la première ajout que si on indique au moins un caractère
 +>Il est plus simple, en cas de succession de commandes parmi lesquelles figure __une commande d'​ajout__ de ligne, ​
 +>​d'​utiliser l'​adressage d'​encadrement /^mon/.
 +
 +<code user>sed -e '1a\ ' -e '/​^mon/,​$s/​^/​ /' sed-automn.txt</​code>​
 +
 +===Utiliser conjointement i et a ===
 +
 +Modifier le fichier "​sed-automn.txt"​ :
 +  * en insérant le titre "Ton sentiment comme atmosphère"​
 +  * en insérant une ligne ne comportant qu'un espace, ​
 +  * en ajoutant un espace à partir de la ligne /^automne/
 +
 <code user> <code user>
-cat sed-cmd+sed -e '​1i\Ton sentiment comme atmosphère'​\ 
 + -e '/​^automne/​i\ '\ 
 + -e '​1,​$s/​^/​ /' -i sed-automn.txt 
 +</​code>​ 
 + 
 +>Il est à noter les adressages utilisés pour obtenir ce résultat, par rapport à ceux utilisés précédemment 
 +>pour les exemples où les commandes i et a étaient utilisées seules. 
 + 
 +On aurait pu utiliser pour obtenir le même résultat : 
 +<code user> 
 +sed -e '​1i\Ton sentiment comme atmosphère'​\ 
 + -e '1i\ '\ 
 + -e '​1,​$s/​^/​ /' -i sed-automn.txt 
 +</​code>​ 
 + 
 +>Voir la prochaine note. 
 + 
 +===Résultat=== 
 +L'​option ''​-i''​ a été utilisée, le fichier "​sed-automn.txt"​ est maintenant : 
 +<code user> 
 +cat sed-automn.txt
 </​code>​ </​code>​
 <​code>​ <​code>​
Ligne 369: Ligne 411:
  et son adieu  et son adieu
 </​code>​ </​code>​
 +<note important>​
 +Attention !\\
 + 
 +Si on utilise __plusieurs commandes d'​ajout__,​ la charge de la mémoire tampon est si importantes
 +que sed se réfère à la numérotation des lignes du __fichier d'​origine__ ​ pour l'​adressage par numéro de ligne __de toutes les commandes__!\\ ​
 +
 +Ainsi cette ligne de commandes sed :
 +<code user>
 +sed -e '​1i\Ton sentiment comme atmosphère'​\
 + -e '2i\ '\
 + -e '​2,​$s/​^/​ /' sed-automn.txt
 +</​code>​
 +<​code>​
 +Ton sentiment comme atmosphère
 +automne
 + 
 + mon bel automne
 +# J'ai supprimé le reste du retour qui ne sert pas l'​explication.
 +</​code>​
 +Et celle-ci :
 +
 +<code user>
 +sed -e '​1i\Ton sentiment comme atmosphère'​\
 + -e '2i\ '\
 + -e '​3,​$s/​^/​ /' sed-automn.txt
 +</​code>​
 +<​code>​
 +Ton sentiment comme atmosphère
 +automne
 + 
 +mon bel automne
 + dans les vergers
 +# J'ai supprimé le reste du retour qui ne sert pas l'​explication.
 +</​code>​
 +Ce point est très important pour la création de scripts sed plus complexes.\\ ​
 +Il faut toujours considérer le contenu de la mémoire tampon pour enchaîner plusieurs commandes.
 +</​note>​
  
 ====Adressage double ==== ====Adressage double ====
Ligne 385: Ligne 464:
 |y/​..../​..../​ | translittération | |y/​..../​..../​ | translittération |
 |c\texte |changement de texte| |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 ==== ===="​p"​ : affichage ====
 <code user> <code user>
-sed -n '/​.*,​[[:​space:​]]/,​10p' sed-cmd+sed -n '/​.*,​[[:​space:​]]/,​9p' sed-automn.txt
 </​code>​ </​code>​
 <​code>​ <​code>​
-tes fruits, ta pomme + tes fruits, ta pomme 
-et le cerf, et son brame + et le cerf, et son brame
-à jamais aimés+
 </​code>​ </​code>​
  
 ===="​d"​ : suppression ==== ===="​d"​ : suppression ====
 <code user> <code user>
-sed '/tes/,10d' sed-cmd+sed -e '​4,​6d'​ -e '8,14d' sed-automn.txt
 </​code>​ </​code>​
 <​code>​ <​code>​
-automne +Ton sentiment comme atmosphère 
-mon bel automne +  
-dans les vergers + ​automne 
-du fond du ciel + les éperviers  
-les éperviers ​ + me donnent 
-de l'​homme + et des langueurs 
-en ton cheveu + et son adieu
-me donnent +
-et des langueurs +
-et son adieu+
 </​code>​ </​code>​
  
 ==== "​="​ numérotation==== ==== "​="​ numérotation====
 <code user> <code user>
-sed '​1,​$='​ sed-cmd+sed '​1,​$='​ sed-automn.txt
 </​code>​ </​code>​
 <​code>​ <​code>​
 1 1
-automne+Ton sentiment comme atmosphère
 2 2
-mon bel automne+ 
 3 3
-dans les vergers+ ​automne
 4 4
-du fond du ciel+ mon bel automne
 5 5
-les éperviers ​+ ​dans ​les vergers
 6 6
-de tes yeux planent+ du fond du ciel
 7 7
-tes feuilles+ les éperviers ​
 8 8
-tes fruits, ta pomme+ ​de ​tes yeux planent
 9 9
-et le cerf, et son brame+ tes feuilles
 10 10
-à jamais aimés+ tes fruits, ta pomme
 11 11
-de l'​homme+ et le cerf, et son brame
 12 12
-en ton cheveu+ à jamais aimés
 13 13
-me donnent+ de l'​homme
 14 14
-et des langueurs+ en ton cheveu
 15 15
-et son adieu+ me donnent 
 +16 
 + et des langueurs 
 +17 
 + et son adieu
 </​code>​ </​code>​
 +<note tip>
 +Pour n'​avoir que la numérotation,​ on peut utiliser l'​option ''​-n''​ :
  
 +<code user>
 +sed -n '​='​ sed-automn.txt
 +</​code>​
 +</​note>​
 ==== "​y"​ : translittération==== ==== "​y"​ : translittération====
 <code user> <code user>
-sed '2,$!y/a/A/' sed-cmd+sed '3,4y/a/A/' sed-automn.txt
 </​code>​ </​code>​
 <​code>​ <​code>​
-Automne +Ton sentiment comme atmosphère 
-mon bel automne +  
-dans les vergers + Automne 
-du fond du ciel + mon bel Automne 
-les éperviers  + dans les vergers 
-de tes yeux planent + du fond du ciel 
-tes feuilles + les éperviers  
-tes fruits, ta pomme + de tes yeux planent 
-et le cerf, et son brame + tes feuilles 
-à jamais aimés + tes fruits, ta pomme 
-de l'​homme + et le cerf, et son brame 
-en ton cheveu + à jamais aimés 
-me donnent + de l'​homme 
-et des langueurs + en ton cheveu 
-et son adieu+ me donnent 
 + et des langueurs 
 + et son adieu
 </​code>​ </​code>​
  
 ==== "​c"​ : changement de texte==== ==== "​c"​ : changement de texte====
 <code user> <code user>
-sed -e '3,$c\ +sed -e '5,$c\ 
-fleuve Léthé\ + ​fleuve Léthé\ 
-en ton grand coeur\ + en ton grand coeur\ 
-devient Vestale\  + ​devient Vestale\  
-' sed-cmd+' sed-automn.txt
 </​code>​ </​code>​
 <​code>​ <​code>​
-automne +Ton sentiment comme atmosphère 
-mon bel automne +  
-fleuve Léthé + automne 
-en ton grand coeur + mon bel automne 
-devient Vestale+ ​fleuve Léthé 
 + en ton grand coeur 
 + ​devient Vestale
 </​code>​ </​code>​
  
 +====Toutes ces commandes regroupées en un script ====
 +  * Créer un script qui utilisera toutes ces commandes
 +  * pour transformer le fichier "​sed-automn.txt"​
 +
 +===Le script ===
 +
 +<code bash>
 +/​.*,​[[:​space:​]]/,​9p
 +4,6d;8,14d
 +#1,$=
 +3,4y/a/A/
 +5,$c\
 + ​fleuve Léthé\
 + en ton grand coeur\
 + ​devient Vestale
 +</​code>​
 +
 +===Lancer le script avec l'​option -i ===
 +
 +<code user>
 +sed -f script-sed.poesie -i sed-automn.txt
 +</​code>​
 +<​code>​
 +Ton sentiment comme atmosphère
 + 
 + ​Automne
 + tes fruits, ta pomme
 + et le cerf, et son brame
 + ​fleuve Léthé
 + en ton grand coeur
 + ​devient Vestale
 +</​code>​
  
 =====La commande "​s"​===== =====La commande "​s"​=====
Ligne 1122: Ligne 1223:
 ====La commande N==== ====La commande N====
 La commande "​N"​ insère le caractère "​nouvelle ligne" (\n) à la fin du contenu de l'​espace de travail et ajoute la ligne suivante du flux d'​entrée à l'​espace de travail.\\ ​ La commande "​N"​ insère le caractère "​nouvelle ligne" (\n) à la fin du contenu de l'​espace de travail et ajoute la ligne suivante du flux d'​entrée à l'​espace de travail.\\ ​
-Une fois le caractère "​nouvelle ligne" dans l'​espace de travail, il peut être appelé par \n par une commande interne de sed qui peut alors substituer un caractère ​par une nouvelle ligne.\\ ​+Une fois le caractère "​nouvelle ligne" dans l'​espace de travail, il peut être appelé par \n par une commande interne de sed qui peut alors substituer un caractère une nouvelle ligne par un espace.\\ 
  
 ===Exemples=== ===Exemples===
 +
 +  * Sans adressage :
 <code user> <code user>
-echo -e "​A\nB\nC\nD\nE"​ | sed '{N;s/B/X/}'+echo -e "​coucou\ntiti"​ | sed '/​coucou/​{N;​s/​\n/​ /}' 
 +</​code>​ 
 +<​code>​ 
 +coucou titi 
 +</​code>​ 
 +> Là, pour la ligne comportant "​coucou",​ s se sert du caractère de fin de ligne placé dans l'​espace de travail pour pouvoir matcher ce retour à la ligne avec "​echo"​. 
 +>Elle peut alors le remplacer par un espace entre "​coucou"​ et "​titi"​. 
 + 
 +  * Avec adressage : 
 +<code user> 
 +echo -e "​A\nB\nC\nD\nE"​ | sed '/B/{N;s/\n/ /}'
 </​code>​ </​code>​
 <​code>​ <​code>​
 A A
-+C
-C+
 D D
 E E
 </​code>​ </​code>​
-> Là, le caractère nouvelle ligne placé dans l'​espace de travail n'a pas été utilisé par la substitution. 
  
 +<note tip>
 +C'est l'​inverse de ceci !
 <code user> <code user>
-echo -e "​coucou\ntiti" | sed '/coucou/{N;s/\n/ /}'+echo "​coucou ​titi" | sed 's/ /\n/'
 </​code>​ </​code>​
 <​code>​ <​code>​
-coucou titi+coucou 
 +titi
 </​code>​ </​code>​
-> Là, pour la ligne comportant "​coucou"​s se sert du caractère ​de fin de ligne placé dans l'espace de travail pour pouvoir matcher ce retour à la ligne avec "echo". + 
->Elle peut alors le remplacer par un espace ​entre "​coucou"​ et "​titi"​.+Bien penser dans la grammaire de sed ! 
 +S'il y a plus deux mots séparés d'​espacesdonc plus de deux espaces à substituer en autant ​de saut de lignes,\\  
 +il faudrait ajouter ​l'option ​"g" ​de la commande s.\\  
 +Sinon, sed affiche ​le résultat et sort après avoir trouvé la première occurrence d'un espace. 
 +</​note>​
  
 ====D ( Delete ) ==== ====D ( Delete ) ====
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