linux:sed
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| linux:sed [04/09/2006 14:49] – créée daniel | linux:sed [10/08/2012 15:26] (Version actuelle) – bugfix catsc daniel | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== mémo sed ====== | ====== mémo sed ====== | ||
| + | Pas mal de scripts sur http:// | ||
| + | |||
| + | Cette page existe en plus complet sur http:// | ||
| + | |||
| + | Une autre doc assez complète sur http:// | ||
| + | |||
| + | Dans le " Guide avancé d' | ||
| + | |||
| + | Sans oublier le bon " | ||
| + | |||
| * sed -e expression | * sed -e expression | ||
| * sed -ne expression : idem, mais n' | * sed -ne expression : idem, mais n' | ||
| - | * sed -ie expression fichier : applique l' | + | * sed -i -e expression fichier : applique l' |
| expression est en général de la forme | expression est en général de la forme | ||
| Ligne 9: | Ligne 19: | ||
| * /pattern/ commande : applique la commande aux lignes qui vérifient le pattern | * /pattern/ commande : applique la commande aux lignes qui vérifient le pattern | ||
| * / | * / | ||
| + | * /pattern/,$ : applique la commande entre la première ligne qui vérifie pattern (incluse) et la fin du fichier. | ||
| + | |||
| + | |||
| ===== Commandes ===== | ===== Commandes ===== | ||
| Ligne 16: | Ligne 29: | ||
| sed -e '/ | sed -e '/ | ||
| ajout d'une ligne\ | ajout d'une ligne\ | ||
| - | et d'une autre.' | + | et d'une autre.\ |
| + | La dernière à ajouter n' | ||
| + | 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/ | + | * c : change des lignes complètes, ex (vire le corps des fonctions, blocs compris entre accolades ouvrantes/ |
| sed -e '/ | sed -e '/ | ||
| [... corps de la fonction ...]' < fichier.c > resume | [... corps de la fonction ...]' < fichier.c > resume | ||
| - | * d : efface la ligne (rmq, "!d" est souvent utilisé pour sélectionner des lignes à garder) | + | * d : efface |
| + | * D : efface le début du buffer jusqu' | ||
| * i : insère avant la ligne. | * i : insère avant la ligne. | ||
| * l : idem p avec les caractères de contrôle | * l : idem p avec les caractères de contrôle | ||
| * n : passe à la ligne suivante (sans appliquer les commandes suivantes à la ligne courante) et y applique la commande suivante. | * n : passe à la ligne suivante (sans appliquer les commandes suivantes à la ligne courante) et y applique la commande suivante. | ||
| + | * N : charge la ligne suivante dans le buffer | ||
| * s/ | * s/ | ||
| * p : affiche la ligne | * p : affiche la ligne | ||
| + | * P : affiche le début du buffer jusqu' | ||
| + | * q : quitte le script (sans analyser les lignes suivantes) | ||
| * y/ | * y/ | ||
| Ligne 37: | Ligne 56: | ||
| * g : toutes les occurences sont remplacées | * g : toutes les occurences sont remplacées | ||
| * N : seule la Nième occurence est remplacée | * N : seule la Nième occurence est remplacée | ||
| - | * p : fiche la ligne si subtitution | + | * p : affiche |
| * w fichier : envoie le résultat de la substitution dans un fichier | * w fichier : envoie le résultat de la substitution dans un fichier | ||
| * I : insensible à la casse (extension GNU) | * I : insensible à la casse (extension GNU) | ||
| Ligne 44: | 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 ===== | ||
| + | |||
| + | Il est aussi possible d' | ||
| + | * P affiche la première ligne du pattern space. | ||
| + | * x échange les contenus du pattern space et du hold space. | ||
| + | * g remplace le contenu du pattern space par celui du hold space. | ||
| + | * G ajoute un caractère nouvelle ligne et le contenu du hold space au 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. | ||
| + | * 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' | ||
| + | |||
| + | ===== Exemples ===== | ||
| + | |||
| + | |||
| + | |||
| + | ==== Effacer les lignes qui suivent un pattern, mais pas celle du pattern ==== | ||
| + | <code sed> | ||
| + | sed -e '/ | ||
| + | # on affiche la 1re | ||
| + | p | ||
| + | # on efface les suivantes | ||
| + | :boucle | ||
| + | d | ||
| + | $! b boucle | ||
| + | # $! est la négation de $, qui signifie la dernière ligne | ||
| + | }' | ||
| + | </ | ||
| + | |||
| + | Mais pour arriver au même résultat, cela paraît plus intelligent d' | ||
| + | <code sed> | ||
| + | sed -ne ' | ||
| + | </ | ||
| + | |||
| + | 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 | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Récupérer les tailles d' | ||
| + | <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' | ||
| + | # si on voulait distinguer width et height, il faudrait deux blocs comme celui-ci | ||
| + | s# | ||
| + | s# | ||
| + | # on passe ces deux nb en holdspace et on récupère la ligne initiale | ||
| + | x | ||
| + | } | ||
| + | |||
| + | # on cherche une image | ||
| + | / | ||
| + | s# | ||
| + | # 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 | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Virer les commentaires ==== | ||
| + | |||
| + | sed est " | ||
| + | |||
| + | <code sed> | ||
| + | sed -e '{ :boucle; N; $! b boucle;}; s#/ | ||
| + | </ | ||
| + | Ça marche pour virer les "/* bla bla */" mais ça garde du "/* bla * bla */", on peut peaufiner en virant d' | ||
| + | <code sed> | ||
| + | sed -e '{ :boucle; N; $! b boucle;}; s/ | ||
| + | </ | ||
| + | |||
| + | Et si on veut aussi virer les commentaires qui suivent "#" | ||
| + | <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@\([^/ | ||
| + | s@/ | ||
| + | s@µ£µ£µ£@\*@g; | ||
| + | |||
| + | # On vire ce qui suit # sur une ligne | ||
| + | s@# | ||
| + | # les lignes qui commencent par ; (esp avant éventuels) | ||
| + | s@\n[ \t]*; | ||
| + | # et par // | ||
| + | s@\n[ \t]*// | ||
| + | # 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; | ||
| + | </ | ||
| + | |||
| + | et dans un fichier d' | ||
| + | |||
| + | <code bash> | ||
| + | alias catsc=' | ||
| + | s@\([^/ | ||
| + | s@/ | ||
| + | s@µ£µ£µ£@\*@g; | ||
| + | s@# | ||
| + | s@\\n[ \\t]*; | ||
| + | s@\\n[ \\t]*// | ||
| + | s@\\n[ \\t]*\\n@\\n@g; | ||
| + | s@[\\n]\+@\\n@g;"' | ||
| + | </ | ||
| + | |||
| + | ==== Récupérer des initiales ==== | ||
| + | On utilise l' | ||
| + | (script utilisé dans claws-mail, cf http:// | ||
| + | < | ||
| + | sed -re ' | ||
| + | # vire ce qui suit un < s'il est précédé d'au moins une lettre | ||
| + | s/ | ||
| + | # vire ce qui suit @ | ||
| + | s/ | ||
| + | # 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/ | ||
| + | # vire les caractères tiret-espace-point | ||
| + | s/[- \."< | ||
| + | # ajoute "> " à la fin de ce qui reste | ||
| + | s/ | ||
| + | </ | ||
linux/sed.1157374186.txt.gz · Dernière modification : 27/10/2006 11:41 (modification externe)