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.

10 réponses

1 2
Avatar
Julien Salgado
Léonard Wauters a écrit :
(Re)Bonjour à tous,


salut,

Y-a-til un programme en ligne de commande qui permet de faire cela ?
( Genre $remplace --chaine1 "titi" -chaine2 "tata" )


perl le fait très bien :
perl -ni -e 's/titi/tata/g;print' fichier1 fichier2 fichier3


--
Julien

Avatar
Thomas Houssin
Salut
sed est fait pour ca ; par exemple :
cat mon fichier | sed 's/titi/tata/g' > mon_fichier
devrait faire l'affaire
Thomas

Léonard Wauters a écrit:
(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.


Avatar
Christophe PEREZ
Le Fri, 29 Aug 2003 15:03:30 +0200, Léonard Wauters a écrit:

Y-a-til un programme en ligne de commande qui permet de faire cela ?
( Genre $remplace --chaine1 "titi" -chaine2 "tata" )


#!/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

--
Christophe PEREZ

Avatar
Jérémy JUST
On Fri, 29 Aug 2003 17:18:45 +0200
Thomas Houssin wrote:

sed est fait pour ca ; par exemple :
cat mon_fichier | sed 's/titi/tata/g' > mon_fichier
devrait faire l'affaire


Surtout pas!!!

cat va ouvrir le fichier en lecture, lire le début, le passer à sed,
qui va le traiter en renvoyer le résultat. Là, le shell va ouvrir le
fichier en écriture (à cause de `>'), donc en effacer le contenu. Puis
cat va faire une erreur, ou au moins s'arrêter.

Bilan: le fichier aura *seulement* été vidé de son contenu.
Pour faire ça, il y a plus simple:
$ :> mon_fichier


La solution (Christophe
Perez) contourne cette difficulté en passant par un fichier temporaire.
L'inconvénient est que les droits d'origine sont perdus.

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

--
Jérémy JUST

Avatar
Christophe PEREZ
Le Fri, 29 Aug 2003 22:39:03 +0200, Jérémy JUST a écrit:

$ :> mon_fichier


Euh... tu peux préciser stp ?

La solution (Christophe
Perez) contourne cette difficulté en passant par un fichier temporaire.
L'inconvénient est que les droits d'origine sont perdus.


Exact, pas pensé à ça.

--
Christophe PEREZ

Avatar
Christophe PEREZ
Le Fri, 29 Aug 2003 17:03:48 -0400, Christophe PEREZ a écrit:

Le Fri, 29 Aug 2003 22:39:03 +0200, Jérémy JUST a écrit:

$ :> mon_fichier


Euh... tu peux préciser stp ?


Je ne voudrais pas avoir l'air d'insister lourdement, mais j'aimerais bien
comprendre ! ;-)

--
Christophe PEREZ


Avatar
Bibiche
Lu,

On Mon, 15 Sep 2003 12:37:54 -0400
Christophe PEREZ wrote:

$ :> mon_fichier


Euh... tu peux préciser stp ?
Je ne voudrais pas avoir l'air d'insister lourdement, mais j'aimerais

bien comprendre ! ;-)


man bash :
- section « COMMANDES INTERNES DU SHELL »
: [arguments]
Pas d'effet. Cette commande ne fait rien d'autre que l'expansion des
arguments et la mise en place des redirections.Le code de retour est nul.

- section « REDIRECTION »
Redirection de sortie
Lors d'une redirection de sortie, le fichier dont le nom résulte
du développement du mot est ouvert en écriture, avec le descripteur de
fichier n, ou en tant que sortie standard (descripteur de fichier 1) si
n n'est pas mentionné. Si le fichier n'existe pas, il est créé. S'il
existait déjà, sa taille est ramenée à 0. Le format général des
redirections de sortie est le suivant :
[n]>mot


Synthèse :
Le > implique la création du fichier (ou l'écrasement) et comme la
commande rien ne produit rien sur la sortie standart (stdout) le fichier
reste vide.


Rappel :
Si l'option noclobber de la commande interne set est activée, la
redirection échouera si le fichier dont le nom résulte du développement
du paramètre existe et est un fichier régulier. Dans ce cas il faut
utiliser le redirecteur de flux >| ce qui donne :
:>| monFichier

Bref, man bash.

A+,

Bibiche.



Avatar
Christophe PEREZ
Le Tue, 16 Sep 2003 00:42:46 +0200, Bibiche a écrit:

Bref, man bash.


C'est très gentil d'avoir pris le temps de me donner toute cette
explication, à laquelle j'avoue ne pas comprendre grand chose (mais ça
tient uniquement à moi et mon neurone).

Je ne vois pas du tout comment appliquer ça dans le cas initial posé du :
$ cat mon fichier | sed 's/titi/tata/g' > mon_fichier

car :
$ cat mon_fichier | sed 's/titi/tata/g' :> mon_fichier
sed: impossible de lire :: No such file or directory

De même que :
$ cat mon_fichier | sed 's/titi/tata/g' :>| mon_fichier
sed: impossible de lire :: No such file or directory

Mais, ce n'est pas bien grave, c'était juste pour comprendre ;-)

--
Christophe PEREZ

Avatar
Bibiche
Lu,

On Mon, 15 Sep 2003 19:13:36 -0400
Christophe PEREZ wrote:

C'est très gentil d'avoir pris le temps de me donner toute cette
explication, à laquelle j'avoue ne pas comprendre grand chose (mais ça
tient uniquement à moi et mon neurone).


Qu'est ce que tu n'as pas compris ? je peux revoir l'explication si je
sais vers où m'orienter... Pour l'instant je n'ai fait qu'un copié collé
du man bash.

Je ne vois pas du tout comment appliquer ça dans le cas initial posé
du :$ cat mon fichier | sed 's/titi/tata/g' > mon_fichier


Euh non. En faite Jérémy JUST dit que :
cat mon_fichier | sed 's/titi/tata/g' > mon_fichier
n'est sûrment pas la bonne solution, car ceci aurait pour effet de vider
de son contenu le fichier. Et il ajout que pour faire celà, comprend
vider tous les fichiers, il y a des techniques plus simple, tel que :
: > nomFichier


A+,

Bibiche.

Avatar
Christophe PEREZ
Le Tue, 16 Sep 2003 15:43:58 +0200, Bibiche a écrit:

Qu'est ce que tu n'as pas compris ? je peux revoir l'explication si je
sais vers où m'orienter... Pour l'instant je n'ai fait qu'un copié collé
du man bash.


Non, non, on partirait de trop loin :-))
Mais merci beaucoup quand même.

Euh non. En faite Jérémy JUST dit que :
cat mon_fichier | sed 's/titi/tata/g' > mon_fichier


Oui

n'est sûrment pas la bonne solution, car ceci aurait pour effet de vider
de son contenu le fichier. Et il ajout que pour faire celà, comprend
vider tous les fichiers, il y a des techniques plus simple, tel que :
: > nomFichier


Arg'!!
Mais ce ": > nomFichier" s'inclue où pour la résolution du problème
initial ?

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

--
Christophe PEREZ

1 2