Sed
De BlaxWiki
Révision datée du 9 janvier 2017 à 10:11 par 127.0.0.1 (discussion)
- Docs & exemples :
- http://sed.sourceforge.net - Man en francais et exemples - Exemples divers (tiré de http://www.grymoire.com/Unix/Sed.html) - Multiples exemples avec sed,awk,grep - Manipulation de texte (tiré de http://www.tldp.org/LDP/abs/html/textproc.html)
Généralités[modifier]
sed -e expression : applique l’expression au flux d’entrée ou à un fichier, le fichier ne sera pas modifié, résultat visible sur la sortie standard (avec -i le fichier est modifié) 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[modifier]
= : 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[modifier]
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[modifier]
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> - Supprimer les lignes contenant "Mot de passe" : sed -i -e '/Mot de passe/d' - 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> - Rechercher des logs entre 2 dates : sed -n '/Jan 6 14:00:00/ , /Jan 6 16:00:00/p' haproxy.log-20170107 > logsHaProxy6Jan14-16.log
- Ajout d'une ligne après une pattern, mais uniquement la première pattern.
Ce script doit être écrit dans un fichier .sh car sur une même ligne ca ne fonctionne pas.Le script ne recherche le pattern test1 que de la ligne #1 jusqu'a la 1ere ligne qui contient
le pattern test1 (où il ajoute le mot maison), pour les lignes suivantes il ne fait qu'afficher
#!/bin/bash
sed '1,/^test1$/ {/^test1$/a\
maison
}' nomfichier