Remplacer un texte dans une liste de fichiers

Le
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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Luc.Habert.00__arjf
Le #1901114
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

Luc.Habert.00__arjf
Le #1901115
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

Lorand
Le #1901113
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 ?


Luc.Habert.00__arjf
Le #1901112
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,

dominique
Le #1901111

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

Lorand
Le #1901110
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.
Ph. Ivaldi
Le #1901103
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/

Luc.Habert.00__arjf
Le #1901101
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.

Publicité
Poster une réponse
Anonyme