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

optimisation remplacement dans fichier

9 réponses
Avatar
R12y
Bonjour,

J'ai un ensemble de fichier, sous une arborescece, dans lesquel il faut
remplacer toute occurence de "python2.3" par "python2.4"
Je le fais pour le moment avec ZSH et sed:

for F (**/*.py)
(sed 's,python2.3,python2.4,g' < ${F} > ${F}.tmp ;\
mv ${F}.tmp ${F})

Peut-être y a t il mieux? Je cherche à optimiser dans la longueur de la
ligne à entrer. Perl en dernier choix. J'avais pensé que peut-etre ZSH
avait un module qui fait ça... mais je n'ai pas eu le temps de parcourir
toute sa doc.

Il s'agit d'un répertoire d'environ 20 fichiers maximum,
sans caractères spéciaux dans le nom (le répertoire debian/ d'un package
Debian)

Merci.

--
Telephone portable "intelligent" (SmartPhone) GSM, GPRS,...
Il est sous Linux, ne coute pas trop cher,...
http://www.it2l.com/product_info.php?cPath=91&products_id=456

9 réponses

Avatar
Sébastien MONBRUN aka TiChou
Dans le message <news:,
*R12y* tapota sur f.c.o.unix :

Bonjour,


Salut,

J'ai un ensemble de fichier, sous une arborescece, dans lesquel il faut
remplacer toute occurence de "python2.3" par "python2.4"
Je le fais pour le moment avec ZSH et sed:

for F (**/*.py)
(sed 's,python2.3,python2.4,g' < ${F} > ${F}.tmp ;
mv ${F}.tmp ${F})

Peut-être y a t il mieux?


Oui, bien mieux.

Je cherche à optimiser dans la longueur de la ligne à entrer. Perl en
dernier choix. J'avais pensé que peut-etre ZSH avait un module qui fait
ça... mais je n'ai pas eu le temps de parcourir toute sa doc.


$ rename python2.3 python2.4 **/*.py(.D)

ou mieux, avec le module zmv chargé (autoload -U zmv) :

$ zmv -Q '(**/)(*.py)(.D)' '$1${2//python2.3/python2.4}'

Conseil : tu peux, dans un premier temps, rajouter l'option '-n' à zmv pour
voir le résultat de ce qu'il va faire sans qu'il l'effectue :

$ zmv -Q -n '(**/)(*.py)(.D)' '$1${2//python2.3/python2.4}'

--
Sébastien MONBRUN aka TiChou

Avatar
R12y
[...]
$ rename python2.3 python2.4 **/*.py(.D)
[...]

$ zmv -Q '(**/)(*.py)(.D)' '$1${2//python2.3/python2.4}'


rename/zmv?

il s'agit de remplacer les occurences de python2.3 par python2.4 _DANS_ le
fichier (pas le nom du fichier).


--
Telephone portable "intelligent" (SmartPhone) GSM, GPRS,...
Il est sous Linux, ne coute pas trop cher,...
http://www.it2l.com/product_info.php?cPath‘&products_idE6

Avatar
Philippe Michel
Le 05-01-2006, R12y a écrit :
Bonjour,

J'ai un ensemble de fichier, sous une arborescece, dans lesquel il faut
remplacer toute occurence de "python2.3" par "python2.4"
Je le fais pour le moment avec ZSH et sed:

for F (**/*.py)
(sed 's,python2.3,python2.4,g' < ${F} > ${F}.tmp ;
mv ${F}.tmp ${F})

Peut-être y a t il mieux? Je cherche à optimiser dans la longueur de la
ligne à entrer.


Utiliser ed plutôt que sed permettrait d'eviter le fichier temporaire et
le mv. Quelque-chose comme ça dans la boucle for :

ed - ${F} <<EOF
g/python2.3/s//python2.4/g
w
EOF

Avatar
Stephane Chazelas
On Fri, 06 Jan 2006 00:32:36 +0100, R12y wrote:
Bonjour,

J'ai un ensemble de fichier, sous une arborescece, dans lesquel il faut
remplacer toute occurence de "python2.3" par "python2.4"
Je le fais pour le moment avec ZSH et sed:

for F (**/*.py)
(sed 's,python2.3,python2.4,g' < ${F} > ${F}.tmp ;
mv ${F}.tmp ${F})
[...]


perl -pi -e 's/python2.3/python2.4/g' **/*.py(D.)

--
Stephane

Avatar
Sébastien MONBRUN aka TiChou
Dans le message <news:,
*R12y* tapota sur f.c.o.unix :

rename/zmv?


Oups.

il s'agit de remplacer les occurences de python2.3 par python2.4 _DANS_ le
fichier (pas le nom du fichier).


Désolé, c'était l'heure tardive... Ma réponse aurait du être la même que
celle de Stéphane. Note que tu peux, à la place de perl, utiliser un GNU sed
qui a aussi son option «in place».

--
Sébastien MONBRUN aka TiChou

Avatar
Sébastien MONBRUN aka TiChou
(supersedes )

Dans le message <news:,
*R12y* tapota sur f.c.o.unix :

rename/zmv?


Oups.

il s'agit de remplacer les occurences de python2.3 par python2.4 _DANS_ le
fichier (pas le nom du fichier).


Désolé, c'était l'heure tardive... Ma réponse aurait du être la même que
celle de Stéphane.
Note que tu peux, à la place de perl, utiliser un GNU sed récent qui a aussi
son option «in place».

--
Sébastien MONBRUN aka TiChou

Avatar
Nicolas George
R12y wrote in message
:
for F (**/*.py)
(sed 's,python2.3,python2.4,g' < ${F} > ${F}.tmp ;
mv ${F}.tmp ${F})


Il y a une option -i à GNU sed qui fera ça plus efficacement (mais
fondamentalement de la même manière). Soit dit en passant, les parenthèses
seraient mieux remplacées par des accolades, histoires d'économiser un fork
par fichier. Toujours en passant, si tu l'écris comme ça, ça remplace aussi
« python2x3 », puisque le point reconnaît n'importe quel caractère.

Avatar
R12y
On Fri, 06 Jan 2006 13:18:56 +0000, Nicolas George wrote:

Toujours en passant, si tu l'écris comme ça, ça remplace aussi
« python2x3 », puisque le point reconnaît n'importe quel caractère.


Zut, j'ai oublié de l'échapper.
Merci.

--
Telephone portable "intelligent" (SmartPhone) GSM, GPRS,...
Il est sous Linux, ne coute pas trop cher,...
http://www.it2l.com/product_info.php?cPath‘&products_idE6

Avatar
Laurent Wacrenier
Philippe Michel écrit:
Utiliser ed plutôt que sed permettrait d'eviter le fichier temporaire et
le mv. Quelque-chose comme ça dans la boucle for :


"ed" utilise des fichiers temporaires, sauf qu'on ne les voit pas.
Ils sont normalement dans /tmp ce qui a des avantages et des
inconvenients.