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

Remplacer en masse

18 réponses
Avatar
Léonard Wauters
(Re)Bonjour à tous,

Je cherche à remplacer des chaines de caractères au sein de plusieurs
fichiers. Mais ca me lourde de les ouvrir un à un pour les faire.
J'ai donc pensé à faire une boucle en script bash sur les fichiers de
mon répertoire, mais je cherche encore un utilitaire me permettant de
remplacer des chaines de texte à la volée.
Par exemple, dans un fichier donné, remplacer toutes les occurences de
"titi" par "tata".
Y-a-til un programme en ligne de commande qui permet de faire cela ?
( Genre $remplace --chaine1 "titi" -chaine2 "tata" )


Cordialement,

Léo.

8 réponses

1 2
Avatar
Bibiche
Lu,

On Tue, 16 Sep 2003 13:11:11 -0400
Christophe PEREZ wrote:

En plus clair, comment faire pour remplacer des données dans un
fichier, par sed, et remettant les nouvelles données dans le même
fichier (sans passer par un fichier intermédiaire pour ne pas perdre
les permission) avec _ce_ principe du ": > monFichier" ?


Visiblement ton problème est que tu ne lis pas ce qui est écrit. Jérémy
JUST ne propose pas la commande :
cat mon_fichier | sed 's/titi/tata/g' > mon_fichier

Mais il la cité du message de Thomas Houssin afin de dire pourquoi elle
est mauvaise. Et il explique qu'elle est mauvaise car elle est
équivalente à la commande :
: > nomFichier

Et cette commde : > nomFichier est mauvaise car elle ne fait qu'écraser
le fichier.

On Fri, 29 Aug 2003 22:39:03 +0200
Jérémy JUST wrote:

L'utilisation de Perl avec l'option`-i' ("in place") paraît bien
adaptée (peut-être est-ce aussi possible avec sed?).


La seul solution proposé est l'option -i en perl à toi de te satisfaire
de cela ou de cherche s'il existe une option équivalente pour sed
visiblement aucun pro de sed ne s'est manifesté dans ce sens.

A+,

Bibiche.

Avatar
Christophe PEREZ
Le Wed, 17 Sep 2003 00:55:12 +0200, Bibiche a écrit:

Mais il la cité du message de Thomas Houssin afin de dire pourquoi elle
est mauvaise. Et il explique qu'elle est mauvaise car elle est
équivalente à la commande :
: > nomFichier


Ah !
Ce n'est pas que je ne lis pas, mais effectivement, j'avais mal
interprété et cru que ça solutionnait le problème.

La seul solution proposé est l'option -i en perl à toi de te satisfaire


Non, c'était uniquement l'objectif sed qui m'intéressait.

de cela ou de cherche s'il existe une option équivalente pour sed


Déjà cherché justement, mais je pouvais ne pas avoir tout compris, surtout
quand j'ai lu récemment quelque chose du même genre (mais je ne sais plus
où, en tout cas, ce n'était pas sed) qui traite la totalité du fichier, et
n'envoie la sortie qu'après, justement afin de ne pas avoir ce problème
d'écrasement. .

visiblement aucun pro de sed ne s'est manifesté dans ce sens.


Ok.
Désolé pour toutes mes incompréhensions.

--
Christophe PEREZ

Avatar
Bibiche
Lu,

On Tue, 16 Sep 2003 19:32:03 -0400
Christophe PEREZ wrote:

Non, c'était uniquement l'objectif sed qui m'intéressait.

Déjà cherché justement, mais je pouvais ne pas avoir tout compris,
surtout quand j'ai lu récemment quelque chose du même genre (mais je
ne sais plus où, en tout cas, ce n'était pas sed) qui traite la
totalité du fichier, et n'envoie la sortie qu'après, justement afin de
ne pas avoir ce problème d'écrasement. .

visiblement aucun pro de sed ne s'est manifesté dans ce sens.




N'ayant jamais utilisé sed, j'ai pris mon man et ooohh que vois-je...
SYNOPSIS
sed [OPTION]... {script-only-if-no-other-script} [input-file]...

Là déjà je me pose une question, pourquoi se faire chier avec un « cat
nomFichier | » alors qu'il suffit de donner le nom du fichier en
paramètre ?!

-i[suffix], --in-place[=suffix]
edit files in place (makes backup if extension supplied)

Ca serait-y pas l'option recherchée ?!

Du coup « cat mon fichier | sed 's/titi/tata/g' > mon_fichier » devient :
sed -i 's/titi/tata/g' mon_fichier

Décidement faut vraiment se mettre à lire le man... et à bien
l'interpréter ;-)

A+,

Bibiche.


Avatar
Christophe PEREZ
Le Wed, 17 Sep 2003 04:03:21 +0200, Bibiche a écrit:

Là déjà je me pose une question, pourquoi se faire chier avec un « cat
nomFichier | » alors qu'il suffit de donner le nom du fichier en
paramètre ?!


Ça, je savais, merci, puisque je proposais moi même :
Date: Fri, 29 Aug 2003 12:22:06 -0400
From: Christophe PEREZ
Message-ID:
[...]
#!/bin/bash
for FICHIER in /le/chemin/les_fichiers* ; do
sed 's/titi/tata/g' $FICHIER > /tmp/fichier.tmp
mv -f /tmp/fichier.tmp $FICHIER
done

-i[suffix], --in-place[=suffix]
edit files in place (makes backup if extension supplied)

Ca serait-y pas l'option recherchée ?!


Si tu le dis.

Décidement faut vraiment se mettre à lire le man... et à bien
l'interpréter ;-)


Encore faut-il être capable de maîtriser suffisamment l'Anglais pour
saisir toutes les finesses.

Si tu savais le nombre de choses que je ne capte pas dans un man !...

Et c'est bien pour ça que dès que l'occasion m'est donné d'en comprendre
mieux une option par un exemple concret (d'où la poursuite de ce fil), je
saute dessus.

Ceci dit, tu m'as bien mouché, c'est bien, mais sois rassurée, ce n'est ni
la première, ni la dernière fois.
Mais mon plaisir d'apprendre qui me pousse à poser des questions est
toujours plus important que l'orgueil qui me ferait hésiter à le faire.


--
Christophe PEREZ

Avatar
TiChou
Dans l'article news:,
Christophe PEREZ écrivait :

-i[suffix], --in-place[=suffix]
edit files in place (makes backup if extension supplied)

Ca serait-y pas l'option recherchée ?!


Si tu le dis.



Pas totalement.
Elle sera peut être satisfaisante pour vous, mais sachez quand même que
l'option 'in place' de sed ne conserve pas le propriétaire et le groupe du
fichier et ne modifie pas le fichier mais en fait une copie et efface
l'ancien, l'inode n'est donc pas conservé non plus, au contraire de l'option
'in place' de perl qui elle conserve _tout_.
Cela peut avoir son importance lors de modifications de fichiers ouverts par
d'autres processus, par exemple des fichiers logs.

--
TiChou


Avatar
Christophe PEREZ
Le Wed, 17 Sep 2003 06:15:24 +0200, TiChou a écrit:

Cela peut avoir son importance lors de modifications de fichiers ouverts par
d'autres processus, par exemple des fichiers logs.


C'est clair.
Et donc, en fait, ça revient à priori strictement au même que ma solution
tout à fait inintéressante pour les mêmes raisons.

Merci beaucoup pour ces précisions que je n'avais même pas pris la peine
de vérifier.

--
Christophe PEREZ

Avatar
g.patel
On Tue, 16 Sep 2003 19:32:03 -0400, Christophe PEREZ
wrote:

(...)
La seul solution proposé est l'option -i en perl à toi de te satisfaire


Non, c'était uniquement l'objectif sed qui m'intéressait.


si c'est de la sedomanie, je ne peux rien; si c'est de la
perlophobie, on peut utiliser ed à la place, comme ici

[ gerard]$ vi mon_fichier
[ gerard]$ cat mon_fichier
aaa tutuggg rrrr
tutu est content
aaa tutu
[ gerard]$ ll mon_fichier
-rw-r--r-- 1 gerard gerard 44 sep 17 22:01 mon_fi
chier
[ gerard]$ chmod o+w mon_fichier
[ gerard]$ cat ga
ed -s mon_fichier << '__EOF__'
,s/tutu/totototo/g
w
q
__EOF__

[ gerard]$ ./ga
[ gerard]$ cat mon_fichier
aaa totototoggg rrrr
totototo est content
aaa totototo
[ gerard]$ ll mon_fichier
-rw-r--rw- 1 gerard gerard 56 sep 17 22:01 mon_fi
chier
[ gerard]$

je ne pense pas que ça soit possible avec une seule
ligne de commande, mais ça peut servir dans un script (j'ai
piqué l'idée dans un script de Mandrake...)

Gerard


Avatar
Christophe PEREZ
Le Wed, 17 Sep 2003 20:04:17 +0000, gerard patel a écrit:

si c'est de la sedomanie, je ne peux rien; si c'est de la


Plutôt oui :-)

perlophobie,


pas encore ! ;-)

on peut utiliser ed à la place, comme ici


man ed quoi ! :-)

je ne pense pas que ça soit possible avec une seule
ligne de commande, mais ça peut servir dans un script (j'ai
piqué l'idée dans un script de Mandrake...)


C'est bon à savoir effectivement.
Merci pour l'idée et l'exemple, c'est enregistré, ça servira certainement
:-)

--
Christophe PEREZ

1 2