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 [23/12/2008 10:14] – aj optim daniellinux:sed [10/08/2012 15:26] (Version actuelle) – bugfix catsc daniel
Ligne 20: 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 27: 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 43: 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 101: Ligne 106:
 } }
 </code> </code>
 +
  
 ==== Récupérer les tailles d'images dans un mxml ==== ==== Récupérer les tailles d'images dans un mxml ====
Ligne 131: Ligne 137:
   p   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> </code>
linux/sed.1230023678.txt.gz · Dernière modification : 23/12/2008 10:14 de daniel