Sed
De BlaxWiki
Révision datée du 24 août 2012 à 12:24 par 217.174.199.129 (discussion)
Plein de docs/exemples concernant Sed : http://sed.sourceforge.net/ & Man en francais et exemples & Exemples divers & Multiples exemples avec sed,awk,grep
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
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.
Exemples
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) /!\ Attention si il trouve 5 fois la pattern kiki, il ajoutera 5 fois le texte 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 autres 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> - Afficher la ligne 2 d'un fichier sed -n "11 p" <fichier>