linux:sed
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
linux:sed [13/08/2007 19:46] – Ajout exemple daniel | linux:sed [10/08/2012 15:26] (Version actuelle) – bugfix catsc daniel | ||
---|---|---|---|
Ligne 6: | Ligne 6: | ||
Une autre doc assez complète sur http:// | Une autre doc assez complète sur http:// | ||
- | Sans oublier | + | Dans le " |
+ | Sans oublier le bon " | ||
* sed -e expression | * sed -e expression | ||
* sed -ne expression : idem, mais n' | * sed -ne expression : idem, mais n' | ||
- | * sed -i -e 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 19: | Ligne 20: | ||
* / | * / | ||
* /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 '/ | 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/ | ||
Ligne 42: | Ligne 47: | ||
* p : affiche la ligne | * p : affiche la ligne | ||
* P : affiche le début du buffer jusqu' | * P : affiche le début du buffer jusqu' | ||
+ | * q : quitte le script (sans analyser les lignes suivantes) | ||
* y/ | * y/ | ||
Ligne 71: | Ligne 77: | ||
===== Exemples ===== | ===== Exemples ===== | ||
+ | |||
+ | |||
+ | |||
==== Effacer les lignes qui suivent un pattern, mais pas celle du pattern ==== | ==== Effacer les lignes qui suivent un pattern, mais pas celle du pattern ==== | ||
<code sed> | <code sed> | ||
Ligne 76: | Ligne 85: | ||
# on affiche la 1re | # on affiche la 1re | ||
p | p | ||
- | # on charge toutes | + | # on efface |
:boucle | :boucle | ||
- | | + | |
$! b boucle | $! b boucle | ||
- | # et on efface | + | # $! est la négation de $, qui signifie la dernière ligne |
- | d | + | |
}' | }' | ||
+ | </ | ||
+ | |||
+ | 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.txt · Dernière modification : 10/08/2012 15:26 de daniel