Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Remplacer un texte dans une liste de fichiers

8 réponses
Avatar
Lorand
Bonjour à tous,

Je sais remplacer un texte par un autre dans un fichier donné :

sed -n -i 's/ancien texte/nouveau texte/g' fichier.txt

Mais je ne sais pas remplacer "ancien texte" par "nouveau texte" dans une
liste de fichiers à extension donnée dans un répertoire donné.

Avez vous une idée ?
Une piste ?
Une commande ?

Par avance merci.

8 réponses

Avatar
Luc.Habert.00__arjf
Lorand :

Je sais remplacer un texte par un autre dans un fichier donné :

sed -n -i 's/ancien texte/nouveau texte/g' fichier.txt


Euh, non, pas de « -n ».

Mais je ne sais pas remplacer "ancien texte" par "nouveau texte" dans une
liste de fichiers à extension donnée dans un répertoire donné.


sed -i 's/ancien texte/nouveau texte/g' répertoire/*.extension

Avatar
Luc.Habert.00__arjf
Lorand :

Je sais remplacer un texte par un autre dans un fichier donné :

sed -n -i 's/ancien texte/nouveau texte/g' fichier.txt


Euh, non, pas de « -n ».

Mais je ne sais pas remplacer "ancien texte" par "nouveau texte" dans une
liste de fichiers à extension donnée dans un répertoire donné.


sed -n -i 's/ancien texte/nouveau texte/g' répertoire/*.extension

Avatar
Lorand
Le Tue, 04 Sep 2007 22:52:34 +0000, Luc Habert a écrit:

Mais je ne sais pas remplacer "ancien texte" par "nouveau texte" dans une
liste de fichiers à extension donnée dans un répertoire donné.


sed -i 's/ancien texte/nouveau texte/g' répertoire/*.extension


effectivement, ça marche et c'est simplissime ...

j'étais parti sur cette piste

ls -d répertoire/*.extension | sed -i 's/ancien texte/nouveau texte/g'

mais j'arrive pas à récupérer dans le pipe la ligne à filer au sed

quelqu'un peut compléter ?


Avatar
Luc.Habert.00__arjf
Lorand :

ls -d répertoire/*.extension | sed -i 's/ancien texte/nouveau texte/g'

mais j'arrive pas à récupérer dans le pipe la ligne à filer au sed

quelqu'un peut compléter ?


Ça serait :

ls -d répertoire/*.extension | xargs sed -i 's/ancien texte/nouveau texte/g'

. xargs lit une liste de fichiers sur son entrée standard, et exécute la
commande qui lui est passée en argument avec les noms de fichiers comme
arguments. Mais ceci est une horreur, pour plein de raisons :
- si un nom de fichier contient un retour à la ligne, ou même un espace,
xargs va le découper
- ton shell commence par faire tout le boulot (remplacer le motif
« répertoire*.extension » par la liste des fichiers), puis ls ne fait rien
d'autre que les réécrire, pour les fourer à xargs qui enfin les retransmet à
sed, plein d'étapes intermédiaires qui ne font rien du tout.

Tu pouvais aussi faire :

for f in répertoire/*.extension; do
sed -i 's/ancien texte/nouveau texte/g "$f"
done

, la différence avec la méthode que je t'ai donnée étant que là, il y a un
sed exécuté pour chaque fichier,

Avatar
dominique

sed -i 's/ancien texte/nouveau texte/g "$f"
done


Ne manquerait-il pas la quotte fermante en réponse à l'ouvrante de « sed
-i 's... » ?
Dominique
qui aimerait bin écrire des scripts mais qui sait point :-)

Avatar
Lorand
Le Tue, 04 Sep 2007 23:39:13 +0000, Luc Habert a écrit:

[snip]

Merci pour cette réponse qui sera utilisée et sauvegardée.
Avatar
Ph. Ivaldi
Le 05 septembre 2007, (Luc Habert)écrivit :

ls -d répertoire/*.extension | xargs sed -i 's/ancien texte/nouveau
texte/g'


Dans mon "howto_bash" j'ai:
8<------8<------8<------8<------8<------8<------8<------8<------8<------
Comment remplacer une chaine dans plusieurs fichiers
replace chaine tochaine -- files
ou
find ./ -maxdepth profondeur -name "regexp" -exec replace chaine tochaine -- {} ;
8<------8<------8<------8<------8<------8<------8<------8<------8<------

J'ai maintenant une troisième solution.
--
Philippe Ivaldi.
http://piprim.tuxfamily.org/

Avatar
Luc.Habert.00__arjf
dominique :

Ne manquerait-il pas la quotte fermante en réponse à l'ouvrante de « sed
-i 's... » ?


Effectivement, merci d'avoir corrigé. J'ai programmé l'éditeur de ligne de
zsh pour insérer le délimiteur fermant quand je tape le délimiteur ouvrant,
donc je n'ai pas l'habitude de fermer les délimiteurs. Dans mon éditeur, je
le fais aussi, mais seulement pour les délimiteurs courants (parenthèses,
accolades, crochets, guillemets, double quote), et non pour les quotes ou
les backquotes, résultat, des fois, je me plante.