|
|
|
|
||||||
| fr.comp.os.linux.config Prise en main d'un système Linux. |
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Lorand wrote:
> 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 ? Tu as find avec l'option -exec, éventuellement xargs et sûrement d'autres trucs ! |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
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 ? |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
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, |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
Luc Habert a écrit :
> > 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 :-) |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
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. |
|
|
|
#9 |
|
Messages: n/a
Hébergeur: |
Le 05 septembre 2007, Luc.Habert.00__arjf@normalesup.org (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/ |
|
|
|
#10 |
|
Messages: n/a
Hébergeur: |
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. |
|
![]() |
| Outils de la discussion | |
|
|