



SED est, comme son nom l'indique, un éditeur de flux: il permet de manipuler un flux avec des expressions régulières. Celle-ci parfois complexe, par défaut son de la forme POSIX, peuvent être de la forme POSIX étendue. Il offre la possibilité de gérer plusieurs commande, et l'utilisation de block.
Sed est un éditeur de flux. Un éditeur de flux est utilisé pour procéder à des opérations texte basics sur un flux d'entrée (un fichier ou un pipe). En quelques sortes similaire à un éditeur qui permet l'édition par scripts(comme ed), sed travaille en faisant seulement un passage au travers l'entrée(s), et est par conséquence plus efficace. Mais sed a la capacité de filtrer le texte dans un pipe ce qui le distingue des autres editeurs.
-n, --quiet, --silent
Supprimer les affichages automatique de l'espace du paterne.(Des exemples avec les commandes P)
-e script, --expression=script
Ajouter script au commande à exécuter.
-f script-file, --file=script-file
Ajouter le contenu de script-file aux commande à exécuter.
--follow-symlinks
Suivre les liens symboliques quand le traitement est en place.(évite le déréférencement des liens (cf script suivant de --in-place)
-i[SUFFIX], --in-place[=SUFFIX]
Éditer les fichiers qui ont lieux (crée des sauvegarde si l'extension est fournie).
Exemple: C'est un petit script bash proposant une illustration de --follow-symlinks.
#!/bin/bash function showfile(){ local i_show ls -l --color=auto ./fichier*.* for i_show in "" ".lnk"; do echo "$1$i_show: $(cat $1$i_show) (on cat)" done } function separator(){ local ARG; echo -n "go next" for j in $(seq 20); do test $j -ne 20 && ARG="-n" || ARG="" echo $ARG $1; done } if [[ ! -z $1 && $1 != "lnk" ]]; then echo "$1: bad argument" exit fi test -n "$1" && EXT=".$1" for i in "fichier1" "fichier2"; do echo "salut toi $i" > $i ln -sv $i $i.lnk showfile $i test "$i" = "fichier1" && SED="--follow-symlinks " || SED="" sed -i $SED 's/salut//' $i.lnk; echo "operation:sed -i $SED's/salut//' $i$EXT:" showfile $i separator "=" rm $i* done test -z "$1" && EXT="\'lnk\' as" || EXT="no" echo "you can try with $EXT argument..."
-l N, --line-length=N
Spécifier la longueur de la ligne convertie pour la commande 'l'.
--posix
Ne pas utiliser les extension GNU.
-r, --regexp-extended
Utiliser les expressions régulières étendues.
-u, --unbuffered
Charger un taux minimum de données depuis l'entrée et vider les buffers de sortie le plus souvent.
--help
Montrer cette aide et sortir.
--version
Montrer les informations sur la version et sortir.
Si aucune des options -e, --expression, -f, ou --file sont données, alors le premier argument, non option, est passé comme un script sed à interpréter. Tous les autres arguments sont les noms des fichiers d'entrées; si aucuns fichiers d'entrées sont spécifié alors l'entrée standard(stdin) est lue.
Version information (voir la page man de sed, info sed ou sed --version).
: label
Label pour les commandes b et t.
#comment
Les commentaires s' étendent jusqu' à la prochaine nouvelle ligne (ou la fin d' un fragment de script --expression).
}
Fermeture d' acolade de block {}.
=
Afficher le numéro de la ligne actuel
a \
text:ajouter à la fin 'text'(???).
``Append text, which has each embedded newline preceded by a backslash.'' (man sed)
i \
text:ajouter au début 'text'(???).
``Insert text, which has each embedded newline preceded by a backslash.'' (man sed)
Exemple:q [exit-code]
Quitter immédiatement le script sed sans procéder à plus d'entrée, sauf auto-print (-n, --quiet, --silent) n'est pas désactivé l'actuel espace paterne est affiché. le exit-code un argument GNU (relation avec --posix).
Q [exit-code]
Quitter immédiatement le script sed sans procéder à plus d'entrée. C' est une extension GNU.
r filename
Ajouter le texte lu depuis filename.
R filename
Ajouter une ligne lue depuis filename. chaque invocation de la commande lie une ligne de le fichier (sans se replacer au début). C'est une extension GNU.
{
Début d'un block de commandes (ce fini par un }).
b label
Se brancher a label; si label est omis, ce brancher à la fin du script.
t label
Si s/// effectue une bonne substitution depuis que la dernière ligne a été lue ET depuis la dernière t ou T, alors se brancher au label; si label est omis, ce brancher à la fin du script.
T label
Si aucune s/// ne s'effectue, depuis que la dernière ligne est été lue ET depuis une commande t ou T, alors se brancher à à label; si label est omis alors se brancher à la fin du script. C'est une extension GNU.
c \
text:Remplacer la ligne sélectionnée par le text(???).
``Replace the selected lines with text, which has each embedded newline preceded by a backslash.'' (man sed)
Exemple:d
Supprimer l'espace du paterne, démarrer un nouveau cycle.
D
Supprimer jusqu'à la nouvelles ligne intégrées dans l'espace du paterne. Commencer un nouveau cycle, mais arrêter de lire depuis l'entrée si il y a encore des données dans l'espace du paterne.( Un exemple avec P )
h H
Copier/ajouter l'espace du paterne vers l'espace détenteur.
g G
Copier/ajouter l'espace détenteur vers l'espace du paterne.
x
Echanger les contenu des espaces détenteur et paterne.
l
Lister la ligne actuel dans forme "visuellement non ambiguë."
l width Lister la ligne actuel dans forme "visuellement non ambiguë, la couper a width caractères. C'est une extension GNU.
Exemple:n N
Lire/ajouter la ligne suivante de l'entrée dans l'espace du paterne.
p
Afficher l' actuelle espace du paterne.
P
Afficher jusqu'à la nouvelle ligne intégrée de l'espace du paterne.
s/regexp/replacement/
Tente d'itdentifier regexp dans l'espace du paterne. Si l'operation réussie, remplace la portion identifiée avec le repacement. le replacement peut contenir le caractère spécial & pour référer à cette portion identifiée de l'espace du paterne, et les caractères spéciaux \1 à \9 réfèrent aux expressions correspondant aux sous expressions de regexp.
S' il est possible de faire correspondre dans tout un flux avec 'g', ou seulement un certain nombre de fois( s///g, s///nombre), il faut que vous sachiez que d'autre commande son possible dans la substitution (info sed, 3.5 The `s' Command). C'est pour cela que vous devriez faire un tour dans info sed. En plus d'y trouver des info sur les modifeur de cette commande, il y à de la documentation sur les modification de casse (upper to lower, lower to upper...), et plus encore...
Exemple:w filename
Ecrit l'espace du paterne actuel dans filename.
W filename
Ecrit les premières lignes de l'espace du paterne actuel dans filename. C'est une extenstion GNU.
y/source/dest/
Transliter les caractères dans l'espace du paterne qui apparaisse dans source au caractère corespondant de dest.
Les commandes de sed peuvent être données sans adresses, dans quel cas la command sera éxécutée pour toutes les lignes d'entrées; avec une adresse, la command sera seulement éxécutée sur les lignes d'entrées qui correspondent à cette adresse; ou avec 2 adresses, dans quel cas la command sera executée pour toutes entrées qui correspondent à la série inclusive de lignes commançant par la première adresse et continuant jusqu'à la seconde adresse.
3 choses à noter à propos des intervalles d'adresses: la syntaxe est addr1,addr2 (i.e., les adresses sont séparées par une virgule; la ligne à laquelle correspond addr1 sera toujour accéptée, même si addr2 seltionnent une ligne en amont; et si addr2 est une regexp, elle ne sera pas testée sur l'adresse à laquelle addr1 correspond.
Après les adresses (ou intervalle d'adresse), et avant la command, un ! peut être introduit, ça spécifie que la commande sera seulement éxécutée si les adresses (ou l'intervalle d'adresses) ne correspondent pas.
number
Identifie seulement sur la ligne spécifiée par number.
first~step
Identifier toutes les step en commançant par la ligne first. Par exemple ``sed -n 1~2p'' affichera toutes les lignes impaires du flux d'entrée, et les adresses 2~5 identifira toutes les 5 lignes, en commançant par la 2ème. first peut-être 0; auquel cas, sed opère comme s'il aurait été égale à step.(c'est une extention)
$
Identifie la dernière ligne.
/regexp/
Identifie les lignes correspondantes à l'expression régulière regexp.
\cregexpc
Identifie les lignes correspondantes à l'expression régulière regexp les c peuvent être n'importe quel caractère.
\cregexpcI
Comme précedent mais est insensible à la casse. C'est une extention GNU. (info sed, 3.2 Selecting lines with `sed')
\cregexpcM
Le modifieur M à l'identifieur d' expression fais correspondre respectivement (en addition de la réaction normal) la ligne vide avant et après une nouvelle ligne. Il y à des séquences de caractères spéciaux (`\`' et `\'') qui toujour identifie le début et la fin du buffer. C'est une extension GNU.
The `M' modifier to regular-expression matching is a GNU `sed' extension which causes `^' and `$' to match respectively (in addition to the normal behavior) the empty string after a newline, and the empty string before a newline. There are special character sequences (`\`' and `\'') which always match the beginning or the end of the buffer. `M' stands for `multi-line'.(info sed, 3.2 Selecting lines with `sed')
0,addr2
Commence à "la première adresse identifiée" , jusqu'à ce que addr2 soit atteinte. C'est similaire à 1,addr2, à l'éxéption que si addr2 est identifiée à la toute première ligne de l'entrée, la forme 0,addr2 sera à la fin de son intervalle, à l'encontre de la forme 1,addr2, qui est le début de l'intervalle. Ca fonctionne seulement quand addr2 est une expression régulière.
``Start out in "matched first address" state, until addr2 is found. This is similar to 1,addr2, except that if addr2 matches the very first line of input the 0,addr2 form will be at the end of its range, whereas the 1,addr2 form will still be at the beginning of its range. This works only when addr2 is a regular expression'' (man sed)
Exemple 1:addr1,+N Identifira addr1 et les N lignes suivantes.
Exemple:addr1,~N Identifira addr1 et les lignes suivantes jusqu'à ce que la prochain numérot de ligne soit un multiple de N.
Exemple:POSIX.2 BREs devrait être supporté, mais il ne l'est pas complètement pour des raisons problèmes de pérformances. La séquence \n dans une expression régulière correspond à un caractère de nouvelle ligne, et de même pour \a, \t et d' autres séquences.
info sed: pour plus d'information, d'autre exemple...
Après avoir réalisé cette page il m'est venue l'idée de lui offrir une illustration. J' ai pas mal cherché une solution qui était sous mon nez.
J'ai Réalisé un script awk afin de changer de playlist avec nyxmms2. Ce script Permet d'aller à la playlist suivante ou précédente suivant l'argument passé. S' il n'y à pas de playlist avant ou après, il retourne à la dernière ou la première.
le script awk:l'original nyxmms2 playlist list | \ awk \ -v cle="$1" '{ set=0; if(cle=="prev"){ set=-1 } if(cle=="next"){ set=1 } playlist[NR]=$0 }END{ for(i=1;i<=NR;i++){ if(playlist[i] ~ /^\*/){ if( i+set > NR ){ sub(/[ ]+/,"",playlist[1]); print playlist[1]; break; } if( i+set == 0 ){ sub(/[ ]+/,"",playlist[NR]); print playlist[NR] break; } sub(/[ ]+/,"",playlist[i+set]); print playlist[i+set] } } }')"
Ce court script, met une valeur en fonction de l'argument:
prev = -1( playlist précédente )
next = +1( playlist suivante )
tout en enregistrant le flux.
il analyse ligne par ligne le flux enregistré pour afficher la valeur qui sera passée à nyxmms2.
Sed n' a pas d' instruction, il ne connait que des commandes. Donc, j'ai due faire un script pour next, et un script pour prev que voici:
#sed -ne s/^[ ]*// #supprimer les espaces vides du debut permet l'appelle d'un argument entre double quotes /^\*/ { x; /^$/ b end; P; q; } :end $p x
Se script ce démarre avec l' option -n( --quiet ) car on affichera quand ça nous plais.
/^\*/: à l'adresse ou le paterne commence par "*", exécuter le block.Je ne peux pas vraiment expliquer le "$p", mais je suppose que c'est lié au propriété du flux:
Comme je quitte le flux avant d'avoir atteint la fin, il ne l'affiche pas.
Le script sed pour aller à la playlist suivante est un peut plus long:
#premier titre /^\*/ { N; s/.*\n//; s/^[ ]*//; P; q; } :start $!N s/^\(.*\);;.*\(\n.*\)/\1\2/ s/\n/;;/ /\*/ b end; t start :end s/\(.*\);;.*/\1/ s/^[ ]*// $P
A la ligne qui commence par "*",
on ajoute une ligne
on substitue jusqu'à la nouvelle ligne par rien
on afficher, et on quitte
branchement start on ajoute une ligne (sauf la dernière)
on substitue jusqu'à ";;"et après \n(inclus) par avant ";;" et après (inclus) "\n"
on substitue "\n" par ";;"
lorsque le paterne contient "*" on va à end, si non lorsque la dernière substitution a fonctionné, on retourne à start.
à end, on substitue le paterne par ce qu'il y a avant les ";;", et on affiche la dernière ligne
reste plus qu' a :"nyxmms2 playlist list | sed -nf script.sed"
Je vais vous le dire comme ça: "chez moi ça marche", car je ne l'ai testé qu'avec 5 titres.