Pour la portabilité, je ne me base pas sur des fonctionnalités de sed spécifiques à Linux ou BSD. À la place, j'utilise le script overwrite
du livre de Kernighan et Pike sur l'Environnement de Programmation Unix.
La commande est ensuite
find /le/dossier -type f -exec overwrite '{}' sed 's/ancien/nouveau/g' {} ';'
Et le script overwrite
(que j'utilise partout) est
#!/bin/sh
# overwrite: copie l'entrée standard en sortie après EOF
# (version finale)
# set -x
case $# in
0|1) echo 'Utilisation: overwrite fichier cmd [args]' 1>&2; exit 2
esac
fichier=$1; shift
nouveau=/tmp/$$.new; ancien=/tmp/$$.old
trap 'rm -f $nouveau; exit 1' 1 2 15 # nettoyer les fichiers
if "$@" >$nouveau # collecter l'entrée
then
cp $fichier $ancien # sauvegarder le fichier original
trap 'trap "" 1 2 15; cp $ancien $fichier # ignorer les signaux
rm -f $nouveau $ancien; exit 1' 1 2 15 # pendant la restauration
cp $nouveau $fichier
else
echo "overwrite: $1 échoué, $fichier inchangé" 1>&2
exit 1
fi
rm -f $nouveau $ancien
L'idée est de remplacer un fichier uniquement si une commande réussit. Utile dans find
et aussi là où vous ne voudriez pas utiliser
sed 's/ancien/nouveau/g' fichier > fichier # CE CODE NE FONCTIONNE PAS
car le shell tronque le fichier avant que sed
puisse le lire.
0 votes
theunixshell.blogspot.com/2012/12/…