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

sed

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 et g veut dire partout (optionnel). Ici les guillemets 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.

Vous avez peut-être remarqué qu’un traitement de texte comme LibreOffice, 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.

Dominique Meeùs . Date: 2011… 2017