[ accueil | doctorat | Java | JavaScript | faqs | cours ] |
---|
sed
sed
GNU sed
relativement récente. Vous pouvez télécharger la dernière version sur
le site http://ftp.gnu.org/pub/gnu/sed/.% sed 's/voiture/automobile/g' /TMP/srcou mieux (parce que le "find" est plus efficace que le "find-replace") :
% sed '/voiture/ s/voiture/automobile/g' /TMP/srcce deuxième filtre peut-être écrit plus simplement (en utilisant l'"abbréviation"
sed
qui consiste à ne pas répéter une
expression régulière à remplacer - premier opérande de l'opérateur
"find-replace" : s/// - lorsque celle-ci à déjà été énoncée
immédiatement avant, en argument d'un "find") sous la forme :
% sed '/voiture/ s//automobile/g' /TMP/src
% cat <<EOF > /TMP/src 12.34 13.56 19.27 28.47 -36.78 -24.16 -0.45 13.01 -100.45 -56.65 -3.21 12.78 EOFAppliquons ensuite le filtre adapté :
% sed -e 's/\([^ ]*\) \([^ ]*\) \([^ ]*\) \([^ ]*\)/\1 \3 \2 \4/' /TMP/src 12.34 19.27 13.56 28.47 -36.78 -0.45 -24.16 13.01 -100.45 -3.21 -56.65 12.78Remarque importante : ce filtre fonctionne pour tout type de tableau à condition que le séparateur de champs soit une espace.
% cat <<EOF > /TMP/src 12.34 13.56 19.27 28.47 -36.78 -24.16 -0.45 13.01 -100.45 -56.65 -3.21 12.78 EOFAppliquons-lui ensuite un nouveau filtre adapté :
% sed -e 's/\([^[:space:]]*\)[[:space:]]\+\([^[:space:]]*\)[[:space:]]\+\([^[:space:]]*\)[[:space:]]\+\([^[:space:]]*\)/\1 \3 \2 \4/' /TMP/src 12.34 19.27 13.56 28.47 -36.78 -0.45 -24.16 13.01 -100.45 -3.21 -56.65 12.78Remarques importantes :
nl
du monde
Unix/Linux par exemple) et à extraire le bloc de ligne en l'encadrant
par le numéro de la première et celui de la dernière. Ainsi, pour
obtenir le bloc allant de la 1027ième ligne à la 3028ième ligne, il
faut lancer la commande suivante :% sed -n 1027,3028p /TMP/src
sed
en
ligne 3029 évitant ainsi de parcourir inutilement la fin du fichier
src,% sed -n '3029q;1027,3028p' /TMP/srcRemarque : vous pouvez générer un fichier de test en ligne de commande Bourne Shell avec ce qui suit (mais soyez patient) :
N=1 ; while [ ${N} -le 5000 ]; do echo ${N};
N=`expr $N + 1`; done > /TMP/src
,
% cat <<EOF > /TMP/src ceci n'est pas un commentaire 1 # commentaire a la mode Shell ceci n'est pas un commentaire 2 // commentaire uniligne a la mode C++ ceci n'est pas un commentaire 3 ceci n'est pas un commentaire 4 # mais un commentaire suit... ceci n'est pas un commentaire 5 // mais un commentaire suit... EOFAppliquons-lui un filtre adapté :
% sed '/^#/d; /^\/\//d; s/#.*$//; s/\/\/.*$//' /TMP/src ceci n'est pas un commentaire 1 ceci n'est pas un commentaire 2 ceci n'est pas un commentaire 3 ceci n'est pas un commentaire 4 ceci n'est pas un commentaire 5
% cat <<EOF > /TMP/src ceci n'est pas un commentaire 1 /* * ceci est un commentaire sur 3 lignes... */ ceci n'est pas un commentaire 2 /* ceci est un debut de commentaire sur 4 lignes... * ceci est un commentaire sur 4 lignes... * ceci est un commentaire sur 4 lignes... * ceci est un commentaire sur 4 lignes... */ ceci n'est pas un commentaire 3 /* ceci est un commentaire sur 1 ligne */ EOFAppliquons-lui un filtre adapté :
% sed -e :ETIQUETTE -e 's#/\*.*\*/##g; \#/\*#N; \##bETIQUETTE' /TMP/src ceci n'est pas un commentaire 1 ceci n'est pas un commentaire 2 ceci n'est pas un commentaire 3
% sed '/^[[:space:]]*$/d' /TMP/src
sed
(on n'affiche aucune
ligne sauf celles allant de la première ligne vide jusqu'à la fin du
fichier)% sed -n '/^$/,$p' /TMP/src
sed
(on supprime toutes les
lignes comprises entre la première ligne du fichier et la première
ligne vide du fichier)% sed -e '1,/^$/d' /TMP/src
formail
% cat /TMP/src | formail -I ""
nl
ou la commande cat --number
% sed = /TMP/src | sed 'N; s/\n/ /' % sed = /TMP/src | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
% cat <<EOF > /TMP/src Le tableau de résultats suit : <insérer ici les résultats> Il précède les commentaires... EOFet un "fichier de substitution" :
% cat <<EOF > /TMP/aInserer 12.03 14.78 16.23 19.34 28.67 39.39 -0.23 12.34 18.26 EOFAppliquons alors une première version de filtre
sed
:% sed '\#<insérer ici les résultats>#r/TMP/aInserer' /TMP/src Le tableau de résultats suit : <insérer ici les résultats> 12.03 14.78 16.23 19.34 28.67 39.39 -0.23 12.34 18.26 Il précède les commentaires...Pour supprimer la ligne à remplacer appliquons une deuxième version de filtre
sed
:% sed -e '\#<insérer ici les résultats>#r/TMP/aInserer' -e '\#<insérer ici les résultats>#d' /TMP/src Le tableau de résultats suit : 12.03 14.78 16.23 19.34 28.67 39.39 -0.23 12.34 18.26 Il précède les commentaires...Le filtre suivant fait exactement la même chose, il est simplement écrit de manière plus concise :
% sed -e '\#<insérer ici les résultats>#{r/TMP/aInserer' -e ';d;}' /TMP/src
% sed G /TMP/src % sed 'G;G' /TMP/src % sed 'G;G;G' /TMP/src
pr --omit-header --double-space /TMP/srcRemarque : un
sed 'n;d'
permet de réaliser l'opération inverse.
% sed -n 7~3p /TMP/src % sed -n '7,${p;n;n;}' /TMP/src
wc -l
, vous pouvez utiliser :% sed -n \$= /TMP/src
% cat --squeeze-blank /TMP/src % sed '/./,/^$/!d' /TMP/src % sed '/^$/N;/\n$/D' /TMP/src
% sed '/^Subject: */!d; s///;q' /TMP/srcRemarque : le filtre qui précède utilise une "abbréviation"
sed
qui consiste à ne pas répéter une
expression régulière à remplacer (premier opérande de l'opérateur
"find-replace" : s///) lorsque celle-ci à déjà été énoncée
immédiatement avant, en argument d'un "find".
% sed -e :ETIQUETTE -e 's/<[^>]*>//g; /</N; //bETIQUETTE' /TMP/src