Différences entre les versions de « Sed »

De BlaxWiki
Aller à la navigationAller à la recherche
Ligne 70 : Ligne 70 :
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  
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.
‘]’, le mettre en premier de la liste, et pour rechercher le caractère ‘-’, le mettre en premier ou en dernier.
<pre>
</pre>
 


==== Exemples ====
==== Exemples ====

Version du 2 avril 2012 à 16:16


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.


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)
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>