Différences entre les versions de « Sed »
De BlaxWiki
Aller à la navigationAller à la recherche| Ligne 5 : | Ligne 5 : | ||
==== Généralités ==== | ==== Généralités ==== | ||
<pre> | <pre> | ||
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 -i suf -e expression fichier : applique l’expression au fichier (pas besoin de préciser entrée sortie) avec backup de l’ancienne version du fichier en fichier.suf (mettre une | |||
chaîne vide à la place de suf pour ne pas avoir de backup) | |||
Attention, l’option -i n’est pas standard, et quand elle existe, elle peut avoir des comportements différents: avec GNU sed, le suffixe est optionnel, alors qu’avec le sed de BSD, il est obligatoire (si bien que dans -i -n, le -n est considéré comme un suffixe et non comme une option). | Attention, l’option -i n’est pas standard, et quand elle existe, elle peut avoir des comportements différents: avec GNU sed, le suffixe est optionnel, alors qu’avec le sed de BSD, il | ||
est obligatoire (si bien que dans -i -n, le -n est considéré comme un suffixe et non comme une option). | |||
expression est en général de la forme | expression est en général de la forme | ||
Version du 2 avril 2012 à 16:15
Plein de docs/exemples concernant Sed : http://sed.sourceforge.net/ & Man en francais et exemples & Exemples divers & Multiples exemples
Généralités
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 -i suf -e expression fichier : applique l’expression au fichier (pas besoin de préciser entrée sortie) avec backup de l’ancienne version du fichier en fichier.suf (mettre une chaîne vide à la place de suf pour ne pas avoir de backup) Attention, l’option -i n’est pas standard, et quand elle existe, elle peut avoir des comportements différents: avec GNU sed, le suffixe est optionnel, alors qu’avec le sed de BSD, il est obligatoire (si bien que dans -i -n, le -n est considéré comme un suffixe et non comme une option). expression est en général de la forme n commande : applique la commande à la ligne n n,m commande : applique la commande aux lignes de n à m /pattern/ commande : applique la commande aux lignes qui vérifient le pattern /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
Commandes
= : affiche le n° de la ligne
a : ajoute des lignes, par exemple :
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 ...]”
sed -e '/^{/,/^}/c\
[... corps de la fonction ...]' < fichier.c > resume
d : efface la ligne (rmq, “!d” est souvent utilisé pour sélectionner des lignes à garder) et retourne au début du script ou de l’expression avec la ligne suivante du fichier
d’entrée.
D : efface le début du buffer jusqu’au premier \n et repart au début du script (avec une nouvelle ligne si le patternspace a été vidé complètement).
i : insère avant la ligne.
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 : ajoute la ligne d’entrée suivante au patternspace et passe à la commande suivante.
s/motif/remplacement/opt
p : affiche la ligne
P : affiche le début du patternspace jusqu’au premier \n.
y/car_src/car_dest/ : substitue des caractères par d’autres
cas du rechercher/remplacer
s/search/replace/opt où opt peut être
rien : la 1re occurence est remplacée
g : toutes les occurences sont remplacées
N : seule la Nième occurence est remplacée
p : affiche la ligne si subtitution
w fichier : envoie le résultat de la substitution dans un fichier
I : insensible à la casse (extension GNU)
Caractères particulier pour le remplacement :
\i ième référence arrière
& chaine complète qui correspond au pattern
Syntaxe des Regex
Echappement des caractères : Tous les caractères sauf ‘.‘, ‘*’ et ‘[’ doivent être “échappés” pour prendre leur signification particulière, par exemple écrire ‘a\{3\}’ pour “trois
caractères ‘a’ consécutifs et ‘a\+’ pour “un ou plusieurs ‘a’” (mais ‘a*’ pour “0, 1 ou plusieurs ‘a’“). Vaut également pour les parentèses capturantes qui doivent s’utiliser avec \ :
‘\(pattern_a_memoriser\)’
Pour ‘.’, ‘*’ et ‘[’, il faut les échapper pour qu’ils soient pris comme des caractères. Les caractères \n \t etc. ont bien la signification habituelle de retour chariot et tabulation
(dans un shell, attention à mettre les expressions sed entre simples quotes pour que le \n soit bien interprêté par sed et pas par le shell).
lorsque ‘/’ est utilisé comme délimiteur, mettre ‘\/’ pour qu’il soit lu comme caractère. A l’intérieur des crochets, un ‘\’ est toujours un caractère. Pour rechercher le caractère
‘]’, le mettre en premier de la liste, et pour rechercher le caractère ‘-’, le mettre en premier ou en dernier.
<pre>
==== Exemples ====
<pre>
remplacer du texte dans un fichier : sed -i -e "s/oldpattern/newpattern/g" nomdufichier
ajouter du texte apres la ligne commencant par la pattern kiki : sed -i -e '/kiki/aTEXTEARAJOUTER' nomdufichier (le "a" signifie append)
changer une ligne contenant la pattern kiki : sed -i -e '/kiki/cTEXTEARAJOUTER' nomdufichier (le "c" signifie change)
Au lieu de mettre des / pour séparer les arguments, on peut mettre des #, cela évite d'avoir à backslasher les /
Les 2 exemples ci-dessous sont équivalents:
[root@pfm-ins-r440-e1 ~]# find /opt/applis/php-5.3.8-1/ -name pdf.so | sed -e "s#/opt/applis/php-5.3.8-1/##g"
lib/php/extensions/no-debug-non-zts-20090626/pdf.so
[root@pfm-ins-r440-e1 ~]# find /opt/applis/php-5.3.8-1/ -name pdf.so | sed -e "s/\/opt\/applis\/php-5.3.8-1//g"
/lib/php/extensions/no-debug-non-zts-20090626/pdf.so
Quelques petits exemples
Substitution (la partie gauche du s/// étant une regex) sed s/bruno/Bruno/ <fichier> > <fichier.nouveau>
Suprimer les lignes 10,14, et 16 à 20 d’un fichier sed ‘10d;14d;16,20d;’ <fichier> > <fichier.nouveau>
Supprimer les lignes commençant par ; sed ‘/^;/d’ <fichier> > <fichier.nouveau>
Afficher uniquement les lignes 10 à 15 d’un fichier sed -n ‘10,15p’ <fichier> > <fichier.nouveau>
Afficher uniquement les lignes paires sed ‘1~2d’ < <fichier>