Outils pour utilisateurs

Outils du site


linux:sed

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édentesRévision précédente
Prochaine révision
Révision précédente
linux:sed [13/08/2007 19:35] – Précisions daniellinux:sed [10/08/2012 15:26] (Version actuelle) – bugfix catsc daniel
Ligne 6: Ligne 6:
 Une autre doc assez complète sur http://okki666.free.fr/docmaster/articles/linux130.html Une autre doc assez complète sur http://okki666.free.fr/docmaster/articles/linux130.html
  
-Sans oublier le bon "Langages de scipts sous linuxde Christophe Blaess chez Eyrolles.+Dans le " Guide avancé d'écriture des scripts Bash", la page sur les regex http://abs.traduc.org/abs-4.2.01-fr/ch17.html#regexref et celle sur sed http://abs.traduc.org/abs-4.2.01-fr/apc.html
  
 +Sans oublier le bon "Langages de scipts sous linux" de Christophe Blaess chez Eyrolles.
  
   * sed -e expression  : applique l'expression au flux d'entrée   * sed -e expression  : applique l'expression au flux d'entrée
   * sed -ne expression : idem, mais n'affiche rien en sortie, sauf si on le précise avec p   * sed -ne expression : idem, mais n'affiche rien en sortie, sauf si on le précise avec p
-  * sed -i -e expression fichier : applique l'expression au fichier (pas besoin de préciser entrée sortie). Attention, pas de sauvegarde de l'ancien fichier (sauvegarde en .bak avec sed -i.bak -e '...').+  * sed -i -e expression fichier : applique l'expression au fichier (pas besoin de préciser entrée sortie). Attention, pas de sauvegarde de l'ancien fichier (sauvegarde en .bak avec sed -i.bak -e '...'). le -i seul marche avec la version gnu de sed, avec la version bsd, une extension est obligatoire, et il faudrait mettre -i'' pour ne pas avoir de sauvegarde (pas testé).
  
 expression est en général de la forme expression est en général de la forme
Ligne 19: Ligne 20:
   * /pattern/,/pattern2/ commande : applique la commande aux lignes qui se trouvent entre une ligne qui vérifie pattern et une autre qui vérifie pattern2   * /pattern/,/pattern2/ commande : applique la commande aux lignes qui se trouvent entre une ligne qui vérifie pattern et une autre qui vérifie pattern2
   * /pattern/,$ : applique la commande entre la première ligne qui vérifie pattern (incluse) et la fin du fichier.   * /pattern/,$ : applique la commande entre la première ligne qui vérifie pattern (incluse) et la fin du fichier.
 +
 +
  
 ===== Commandes ===== ===== Commandes =====
Ligne 26: Ligne 29:
   sed -e '/pattern/a\   sed -e '/pattern/a\
   ajout d'une ligne\   ajout d'une ligne\
-  et d'une autre.' < fichier_src > fichier_dest+  et d'une autre.
 +  La dernière à ajouter n'ayant pas d'antislash 
 +  s/bla/bla/; # autre commande' < fichier_src > fichier_dest
  
   * c : change des lignes complètes, ex (vire le corps des fonctions, blocs compris entre accolades ouvrantes/fermantes qui débutent une ligne, et remplace par "[... corps de la fonction ...]"   * c : change des lignes complètes, ex (vire le corps des fonctions, blocs compris entre accolades ouvrantes/fermantes qui débutent une ligne, et remplace par "[... corps de la fonction ...]"
Ligne 42: Ligne 47:
   * p : affiche la ligne   * p : affiche la ligne
   * P : affiche le début du buffer jusqu'au premier \n (il reste dans le buffer).   * P : affiche le début du buffer jusqu'au premier \n (il reste dans le buffer).
 +  * q : quitte le script (sans analyser les lignes suivantes)
   * y/car_src/car_dest/ : substitue des caractères par d'autres   * y/car_src/car_dest/ : substitue des caractères par d'autres
  
Ligne 57: Ligne 63:
   * \i ième référence arrière   * \i ième référence arrière
   * & chaine complète qui correspond au pattern   * & chaine complète qui correspond au pattern
 +
  
 ===== Holdspace ===== ===== Holdspace =====
Ligne 67: Ligne 74:
   * h remplace le contenu du hold space par celui du pattern space.   * h remplace le contenu du hold space par celui du pattern space.
   * H ajoute un caractère nouvelle ligne et le contenu du pattern space au hold space.   * H ajoute un caractère nouvelle ligne et le contenu du pattern space au hold space.
-  * N ajoute un caractère nouvelle ligne et une nouvelle ligne de données au pattern space (s'il n'y a plus de données à lire, l'emploi de cette commande cause la fin du programme). +  * N ajoute un caractère nouvelle ligne et une nouvelle ligne de données au pattern space (s'il n'y a plus de données à lire, l'emploi de cette commande cause la fin du programme). 
 + 
 +===== Exemples ===== 
 + 
 + 
 + 
 +==== Effacer les lignes qui suivent un pattern, mais pas celle du pattern ==== 
 +<code sed> 
 +sed -e '/pattern/,$ { 
 +  # on affiche la 1re 
 +  p 
 +  # on efface les suivantes 
 +  :boucle 
 +    d 
 +  $! b boucle 
 +  # $! est la négation de $, qui signifie la dernière ligne 
 +}' 
 +</code> 
 + 
 +Mais pour arriver au même résultat, cela paraît plus intelligent d'imprimer toutes les lignes jusqu'au pattern inclus (et pas les suivantes). 
 +<code sed> 
 +sed -ne '1,/pattern/ p' 
 +</code> 
 + 
 +Pour tout charger dans le buffer (pour du remplacement multilignes ensuite, à ne pas faire sur des fichiers de plus de qq ko) 
 +<code sed> 
 +
 +  :boucle 
 +    N 
 +  $! b boucle 
 +
 +</code> 
 + 
 + 
 +==== Récupérer les tailles d'images dans un mxml ==== 
 +<code sed> 
 +#!/bin/sed -nf 
 +# script de parsing des mxml pour récupérer les png et leur taille 
 +# la taille peut être sur la ligne du Embed, mais pas toujours, et dans ce cas 
 +# elle est précisée par la balise précédente qui précise une taille 
 + 
 +# on cherche hauteur largeur 
 +/width=/ { 
 +  # faut garder la ligne entière pour la suite (au cas où il y aurait aussi du embed dedans) => on mémorise en holdspace 
 +  h 
 +  # on remplace width par height car on ne connait pas l'ordre (on aura height en double, on se fout de l'ordre) 
 +  # si on voulait distinguer width et height, il faudrait deux blocs comme celui-ci 
 +  s#width=#height=# 
 +  s#.*height="\([0-9]*\)".*height="\([0-9]*\)".*#\1 \2# 
 +  # on passe ces deux nb en holdspace et on récupère la ligne initiale 
 +  x 
 +
 + 
 +# on cherche une image 
 +/Embed('\/ressources\/medias\/images\//
 +  s#.*@Embed('/ressources/medias/images\/\([^']*\)'.*#\1#; 
 +  # on recupere le holdspace et les valeurs qui s'y trouvent sur une ligne sup 
 +  G; 
 +  # on vire le retour chariot qui s'y trouve 
 +  s#\n# # 
 +  # et on affiche 
 +  p 
 +
 +</code> 
 + 
 + 
 + 
 + 
 + 
 + 
 +==== Virer les commentaires ==== 
 + 
 +sed est "greedy" (gourmand, il prend la plus longue chaîne qui correspond) et y'a pas moyen de mettre *? pour le rendre "ungreedy", faut donc ruser... 
 + 
 +<code sed> 
 +sed -e '{ :boucle; N; $! b boucle;}; s#/\*[^\*]*\*/##g' < fichier 
 +</code> 
 +Ça marche pour virer les "/* bla bla */" mais ça garde du "/* bla * bla */", on peut peaufiner en virant d'abord les * (on les remplaçe par une chaîne exotique dont on suppose qu'elle n'existe pas au préalable, on traite et on remet) 
 +<code sed> 
 +sed -e '{ :boucle; N; $! b boucle;}; s/\([^/]\)\*\([^/]\)/\1µ£µ£µ£\2/g; s#/\*[^\*]*\*/##g; s/µ£µ£µ£/\*/g' < fichier 
 +</code> 
 + 
 +Et si on veut aussi virer les commentaires qui suivent "#" et "<nowiki>//</nowiki>", et les lignes vides, alors, on ajoute : 
 +<code sed> 
 +#!/bin/sed -f     
 + 
 +# on charge tout dans le buffer 
 +{ :boucle; N; $! b boucle;}; 
 + 
 +# on remplace les * isolés, vire les commentaires /* */ et on remets nos * isolés 
 +s@\([^/]\)\*\([^/]\)@\1µ£µ£µ£\2@g; 
 +s@/\*[^\*]*\*/@@g; 
 +s@µ£µ£µ£@\*@g; 
 + 
 +# On vire ce qui suit # sur une ligne 
 +s@#[^\n]*@@g; 
 +# les lignes qui commencent par ; (esp avant éventuels) 
 +s@\n[ \t]*;[^\n]*@\n@g; 
 +# et par // 
 +s@\n[ \t]*//[^\n]*@\n@g; 
 +# les espaces et tabulations seules sur leur ligne 
 +s@\n[ \t]*\n@\n@g; 
 +# et \n multiples qui pourraient rester après la commande précédente 
 +s@[\n]\+@\n@g; 
 +</code> 
 + 
 +et dans un fichier d'alias ça donne (dans la définition de l'alias faut ajouter un \ devant $, \n et \t) 
 + 
 +<code bash> 
 +alias catsc='sed -e "{ :boucle; N; \$! b boucle;}; 
 +s@\([^/]\)\*\([^/]\)@\1µ£µ£µ£\2@g; 
 +s@/\*[^\*]*\*/@@g; 
 +s@µ£µ£µ£@\*@g; 
 +s@#[^\\n]*@@g; 
 +s@\\n[ \\t]*;[^\\n]*@\\n@g; 
 +s@\\n[ \\t]*//[^\\n]*@\\n@g; 
 +s@\\n[ \\t]*\\n@\\n@g; 
 +s@[\\n]\+@\\n@g;"' 
 +</code> 
 + 
 +==== Récupérer des initiales ==== 
 +On utilise l'expression '\<' qui désigne le début d'un mot dans les expressions étendues ('\>' désigne la fin d'un mot). Attention, c'est juste un délimiteur (pas de caractère dedans). On entend par "mot" un changement alphanumérique/non-alpha. 
 +(script utilisé dans claws-mail, cf http://ll.lairdutemps.org/linux/claws-mail#personnalisation_et_scripts) 
 +<code> 
 +sed -re ' 
 +# vire ce qui suit un < s'il est précédé d'au moins une lettre 
 +s/([a-zA-Z]+[^<]*)<.*/\1/; 
 +# vire ce qui suit @ 
 +s/(.*)@.*/\1/; 
 +#  met en capitale la première lettre d'un mot et vire les caractères non tiret-espace-point qui suivent, pour chaque occurence rencontrée 
 +s/(\<.)[^- .]*/\U\1/g; 
 +# vire les caractères tiret-espace-point 
 +s/[- \."<]//g; 
 +# ajoute "> " à la fin de ce qui reste 
 +s/.*/&> /;' 
 +</code>
linux/sed.1187026508.txt.gz · Dernière modification : 13/08/2007 19:46 (modification externe)