web-dev-qa-db-fra.com

Alternative à `sed -i` sur Solaris

Sous Linux sed -i modifiera les fichiers d'entrée en place. Cependant, cela ne fonctionne pas sur Solaris.

sed -i '$ s/OLD/NEW/g' test        
sed: illegal option -- i

Que puis-je utiliser à la place de sed -i sur Solaris?

27
lidia

Vous devrez répliquer -i vous-même en stockant les résultats dans un fichier temporaire, puis en remplaçant le fichier d'origine par le fichier temporaire. Cela peut sembler inélégant, mais c'est tout sed -i fait sous les couvertures.

sed '$ s/OLD/NEW/g' test > test.tmp && cat test.tmp > test && rm test.tmp

Si vous vous en souciez, vous pouvez le rendre un peu plus robuste en utilisant mktemp:

tmp=$(mktemp test.XXXXXX)
sed '$ s/OLD/NEW/g' test > "$tmp" && cat "$tmp" > test && rm "$tmp"
20
John Kugelman

Ce n'est pas exactement la même chose que sed -i, mais j'ai eu un problème similaire. Vous pouvez le faire en utilisant Perl:

Perl -pi -e 's/find/replace/g' file

faire le copier/déplacer ne fonctionne que pour des fichiers uniques. si vous voulez remplacer du texte dans chaque fichier d'un répertoire et de sous-répertoires, vous avez besoin de quelque chose qui le fasse en place. vous pouvez le faire avec Perl et trouver:

find . -exec Perl -pi -e 's/find/replace/g' '{}' \;
24
Charlie B