Dominique Meeùs
Dernière modification le   
retour à la table des matières — à l’index — à ma page de départ

sed

Up: Commandes d’édition dans les fichiers Next: awk

Voir www.grymoire.com/Unix/Sed.html.

Le nom de la commande sed veut dire Stream Editor. Un exemple de substitution (remplacement) avec sed est :

sed 's/day/night/g' myfile > newfile

s veut dire remplacer. Le flag g, optionnel, veut dire partout. (Sinon, la substitution ne s'opère que sur la première occurrence dans la ligne.) Ici les guillemets (single quotes ou autres) ne sont pas indispensables, mais ils le sont si la commande, le script dans la terminologie de sed, était plus complexe et il est donc de bonne politique de les mettre toujours. On peut marquer un script par -e et alors les répéter (en allant à la ligne si l’on veut avec le signe \).

sed \
-e 's/day/night/g' \
-e 's/minute/second/g' \
myfile > newfile

On peut remplacer partout deux espaces par une tabulation, ou au contraire une tabulation par deux espaces (vielle discussion chez ceux qui indentent leur code) :

sed -i "s/ /\t/g" somefile.xml
sed -i "s/\t/ /g" somefile.xml

On peut remplacer, devant certaines ponctuations, des espaces ordinaires (U+0020) [respectivement des espaces insécables ordinaires (U+00A0)] par des espaces fines insécables non justifiables (U+202F). Vous pouvez copier et coller les expressions suivantes ; les espaces exotiques y sont ("s/U+0020?/U+202F?/g" puis "s/U+00A0?/U+202F?/g") même si le browser ne vous permet pas de les distinguer :

sed -i "s/ ?/ ?/g" somefile.xml
sed -i "s/ ?/ ?/g" somefile.xml

Je l’ai fait avec succès, avec les ?, les !, les ; et du côté intérieur des « guillemets » français. Ces caractères sont bien lus comme caractères par sed. Ils n’ont pas ici de signification particulière et ne demandent donc pas de précaution spéciale. Cela ne devrait pas présenter de danger du point de vue du XML non plus parce que ces ponctuations ne sont jamais, ou du moins pas habituellement, précédées d’une espace dans les usages spéciaux comme &amp; ou <?xml version="1.0"?>.

L’éditeur sed, comme d’autres programmes qui doivent rechercher, contrôler, filtrer, éditer du texte, est un grand consommateur d’expressions régulières.

On peut, sans le déclarer, utiliser un autre séparateur, comme

sed 's_day_night_g'

On peut combiner avec find pour remplacer dans tous les fichiers d’une arborescence. Ainsi

find . -name "*.xml" -exec sed -i "s/quelque chose/autre chose/g" '{}' \;

remplacera « quelque chose » par « autre chose » dans tous les fichiers *.xml du répertoire courant et de ses sous-répertoires.

Attention : il en résultera que tous les fichiers *.xml du répertoire courant et de ses sous-répertoires auront été touchés par sed et auront la date et l’heure du jour, ce qui, pour une correction de pure forme, pourrait n’être pas du tout désiré. Un forum propose d’enregistrer le timestamp pour le rétablir après le passage de sed :

find dir -name '*.xml' -exec bash -c 't=$(stat -c %y "$0"); sed -i -e "s/text1/text2/g" "$0"; touch -d "$t" "$0"' {} \;

S’il y a beaucoup de fichiers dans les dossier (et les sous-dossiers), pour éviter d’exécuter de nombreux sed inutiles, on peut vouloir se limiter à ceux qui demandent vraiment cette correction. Pour le changement des apostrophes, j’ai écrit ceci :

grep -l "'" *.xml | while read -r haspoorquotes ; \
do echo "$haspoorquotes" ; \
  tstamp=$(stat -c %y "$haspoorquotes") ; \
  sed -i "s/'/’/g" "$haspoorquotes" ; \
  touch -d "$tstamp" "$haspoorquotes" ; \
done

(Dans le dossier, la liste sans répétition (-l de grep) des noms de ceux des fichiers en .xml qui ont de mauvaises apostrophes est lue par ligne dans une variable haspoorquotes, contenant le nom d’un fichier dont : — Je note le timestamp. — Je change les apostrophes. — Je rétablis le timestamp noté.)

Vous avez peut-être remarqué qu’un traitement de texte comme LibreOffice Writer, c’est lent, et que des éditeurs de texte simple comme gedit ou Bluefish sont plus rapides. Mais sed, c’est de plusieurs ordres de grandeur encore plus rapide que ces derniers. Cela se sent surtout sur de très gros documents où des recherches et remplacement peuvent planter le traitement de texte ou l’éditeur. C’est encore plus vrai s’il fallait ouvrir un à un tous les fichiers d’une arborescence. C’est ainsi que j’ai corrigé en quelques secondes les espaces devant les ponctuations de 400 ou 500 pages de notes de lecture sur le marxisme.

Up: Commandes d’édition dans les fichiers Next: awk