OVH Cloud OVH Cloud

Remplacer du text par lot

14 réponses
Avatar
Fabien SK
Bonjour,

J'ai une série de fichiers dans une arborescence (que je pourrais
trouver avec "find") que je souhaiterais modifier. Je désire remplacer
un texte (disons "toto") par un autre ("tata").
Connaissez-vous un moyen de le faire ? (avec "ed" l'éditeur convivial ?)

Merci de votre attention

4 réponses

1 2
Avatar
Laurent Wacrenier
Stephane Chazelas écrit:
Les gens de chez zsh appellent ça des "POSIX quotes", mais je ne
sais pas de quel standard ils sortent ça.


Pas de POSIX, en tout cas.

Ça vient de ksh93 et ça se trouve dans bash, ksh93 et zsh.


Avatar
Fabien SK
Laurent Wacrenier wrote:

Fabien SK <fabsk+ écrit:

echo $',s/toto/tata/gnw' | ed mon_fichier


(echo ,s/toto/tata/g; echo w) | ed -s fichier


Qu'est-ce qui ne va pas avec ma version ?


- C'est quoi $'' ? Ça n'a pas l'air d'être portable.


Le $'n', je l'ai vu dans un script sur mon système (Mandrake linux) un
jour. A l'époque, c'était la seule manière que je connaissais pour faire
un retour chariot dans une chaîne.
Je veux bien utiliser "printf" comme tu le suggères.




Avatar
Laurent Wacrenier
Fabien SK <fabsk+ écrit:
Le $'n', je l'ai vu dans un script sur mon système (Mandrake linux) un
jour. A l'époque, c'était la seule manière que je connaissais pour faire
un retour chariot dans une chaîne.


On peut aussi saisir le retour chariot :

echo ',s/toto/tata/g
w' | ed -s fichier

Avatar
Stephane Chazelas
Le 20 Oct 2003 14:35:06 GMT, Stephane Chazelas écrivait :
[...]
avec le GNU/*BSD find/xargs/sed:

find . -type f -name '*.type' -print0 | xargs -r0 sed -i 's/toto/tata/g'

Avec perl et zsh:

perl -pi -e 's/toto/tata/g' ./**/*.type(.)

Avec perl tout court:

perl -MFile::Find -pi -e'BEGIN{find sub{
,$File::Find::name if -f&&/.type$/},"."}
s/toto/tata/g'


Pour que les trois solutions soient équivalentes (enfin, un peu
plus équivalentes, du moins fonctionnellement), il faudrait en
fait :

find . -type f ( -name '*.type'
-o -name '.*.type'
-o -name '.type'
) -print0 | xargs -r0 sed -i 's/toto/tata/g'

ou avec un find POSIX (exemple celui du Heirloom Toolchest
[http://heirloom.berlios.de/] sous Linux) et un sed
*BSD/GNU/ssed:

find . -type f -name '*.type' -exec sed -i 's/toto/tata/g' {} +

perl -pi -e 's/toto/tata/g' ./**/*.type(D.)

perl -MFile::Find -pi -e'BEGIN{find sub{
,$File::Find::name if -f&&!-l/.type$/},"."}
s/toto/tata/g' < /dev/null

(pour les cas des symlinks, dotfiles ou l'absence de fichiers
*.type).

--
Stéphane

"Stephane.Chazelas" arobase "free.fr"

1 2