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" )
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
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.
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" )
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.
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
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
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
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
On Fri, 29 Aug 2003 17:18:45 +0200
Thomas Houssin <Thomas.Houssin@int-evry.fr> 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 <pan.2003.08.29.16.22.05.983527@novazur.fr> (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?).
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
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
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 <pan.2003.08.29.16.22.05.983527@novazur.fr> (Christophe
Perez) contourne cette difficulté en passant par un fichier temporaire.
L'inconvénient est que les droits d'origine sont perdus.
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
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
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 ! ;-)
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
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
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
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.
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
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 ;-)
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
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
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
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.
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
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" ?
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" ?