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

10 réponses

1 2
Avatar
Laurent Wacrenier
Fabien SK <fabsk+ écrit:
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 ?)


man ed
(...)
A typical command might look like:

,s/old/new/g

which replaces all occurrences of the string old with new.

Avatar
Fabien SK
Laurent Wacrenier wrote:

Fabien SK <fabsk+ écrit:

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 ?)


man ed
(...)
A typical command might look like:

,s/old/new/g

which replaces all occurrences of the string old with new.


J'ai fait la chose suivante et ça marche

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

Mais maintenant il faut que je le combine avec "find". Le problème est
que je ne sais pas comment utiliser une commande avec pipe avec le
"-exec" de "find", ou alors avec "xargs" (sans passer par un script
intermédiaire).
J'aimerais bien le faire en une seule commande (sans rien écrire sur le
disque).
Si l'un d'entre vous a une astuce pour le faire d'un coup (que ce soit
avec "ed" ou autre), je suis preneur.


Avatar
Laurent Wacrenier
Fabien SK <fabsk+ écrit:
J'ai fait la chose suivante et ça marche

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


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

Mais maintenant il faut que je le combine avec "find". Le problème est
que je ne sais pas comment utiliser une commande avec pipe avec le
"-exec" de "find", ou alors avec "xargs" (sans passer par un script
intermédiaire).


find ... | while read fichier ; do ... ; done

J'aimerais bien le faire en une seule commande (sans rien écrire sur le
disque).


ed peut écrire le buffer sur disque.

Si l'un d'entre vous a une astuce pour le faire d'un coup (que ce soit
avec "ed" ou autre), je suis preneur.


find ... | xargs perl -pi -e 's/toto/tata/g'

Avatar
Fabien SK
Laurent Wacrenier wrote:

Fabien SK <fabsk+ écrit:

J'ai fait la chose suivante et ça marche

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 ?

Mais maintenant il faut que je le combine avec "find". Le problème est
que je ne sais pas comment utiliser une commande avec pipe avec le
"-exec" de "find", ou alors avec "xargs" (sans passer par un script
intermédiaire).
find ... | while read fichier ; do ... ; done



Merci, c'est parfait


Avatar
Stephane Chazelas
Le Mon, 20 Oct 2003 15:22:32 +0200, Fabien SK écrivait :
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 ?)


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'

--
Stéphane [adresse-réelle: "Stephane.Chazelas" arobase "free.fr"]

Avatar
Jean-Marc Bourguet
Fabien SK <fabsk+ writes:

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").


man sed

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Fabien SK
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 ?)


avec le GNU/*BSD find/xargs/sed:

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


Merci. J'utilise peu sed, et jusqu'à présent je ne l'avais utilisé que
sur des pipes (et je croyais qu'il était limité à ça, comme grep).


Avatar
Laurent Wacrenier
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.
- "ed -s" vire le prompt.

Si on n'aime pas echo, on peut le faire avec printf :
printf ",s/toto/tata/gnwn"



Avatar
Stephane Chazelas
Le Mon, 20 Oct 2003 14:48:25 +0000 (UTC), Laurent Wacrenier écrivait :
[...]
- C'est quoi $'' ? Ça n'a pas l'air d'être portable.
[...]


Les gens de chez zsh appellent ça des "POSIX quotes", mais je ne
sais pas de quel standard ils sortent ça.

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

--
Stéphane [adresse-réelle: "Stephane.Chazelas" arobase "free.fr"]

Avatar
Stephane Chazelas
Le Mon, 20 Oct 2003 16:46:21 +0200, Fabien SK écrivait :
[...]
find . -type f -name '*.type' -print0 | xargs -r0 sed -i 's/toto/tata/g'


Merci. J'utilise peu sed, et jusqu'à présent je ne l'avais utilisé que
sur des pipes (et je croyais qu'il était limité à ça, comme grep).


Note toutefois que l'option "-i" de sed n'est pas du tout
standard. Avec un sed standard, faut faire des:

find . -type f -exec sh -Cc '
cat < "$1" > "$1.bak"
&& sed 's/toto/tata/g' < "$1.bak" > "$1"
&& rm -f "$1.bak"
' {} {} ;

(pas testé)

--
Stéphane [adresse-réelle: "Stephane.Chazelas" arobase "free.fr"]


1 2