OVH Cloud OVH Cloud

changer des mots dans plusieurs fichiers

2 réponses
Avatar
tino
Bonjour à tous (et bonne année 2004)

J'ai plusieurs fichiers TEX écrits avec emacs+auctex. Je voudrais
remplacer le mot \niveau dans plusieurs fichiers pr le mot \lniveau .
Peut-on réaliser cela avec emacs en une seule fois ? en ligne de
commande ? ou avec unix ?

(je travaille avec linux)

bien cordialement.

2 réponses

Avatar
Jacques L'helgoualc'h
Matthieu Moy a dit :
[...]

sed "s/niveau/lniveau/gw$HOME/tempo/$i"

est une piste.



Non, seules les lignes *modifiées* iront dans ~/tempo/$i ...

[...]

(Oui, je sais, parce que sed est plus léger et plus standard, mais
pour une commande executée une fois, je me fiche des performances et
de la portabilité !)



Ouais, mais avec sed il y a moins de caractères à taper :)

perl -pi -e 's/niveau/lniveau/' *.tex

fait tout en une ligne ! (et en ne lançant perl qu'une seule fois,
donc, ça peut même être plus rapide que sed !!)



Mon oeil ! Sed v.4 a l'option -i,

782336 /usr/bin/perl
34816 /bin/sed

et le tutoriel Sed est plus court aussi ;)

(perl -h pour comprendre le -pi -e).

Au pire,

find . -name *.tex -exec perl -pi -e '...' {} ;



Vraiment pire, tu lances un nouveau perl sur *chaque* fichier ;)

find -name *.tex -type f|xargs sed -i -e '...'

--
Jacques L'helgoualc'h
Avatar
Matthieu Moy
Jacques L'helgoualc'h writes:

sed "s/niveau/lniveau/gw$HOME/tempo/$i"

est une piste.



Non, seules les lignes *modifiées* iront dans ~/tempo/$i ...



J'ai bien dit une piste ;-)

fait tout en une ligne ! (et en ne lançant perl qu'une seule fois,
donc, ça peut même être plus rapide que sed !!)



Mon oeil ! Sed v.4 a l'option -i,



Bon a savoir.

Mais il s'agit de GNU sed seulement. Sur un Solaris par exemple, j'ai
plus souvent un perl qu'un GNU sed sous la main. (Le premier qui dit
que je suis de mauvaise foi et que je veux pas avoir tort ... ;-)

Au pire,

find . -name *.tex -exec perl -pi -e '...' {} ;



Vraiment pire, tu lances un nouveau perl sur *chaque* fichier ;)

find -name *.tex -type f|xargs sed -i -e '...'



Avec ta solution, j'ai

sed: can't read ./fichier: No such file or directory
sed: can't read avec: No such file or directory
sed: can't read espace.tex: No such file or directory

Alors qu'avec la mienne, ça marche ;-)

Je sais bien que le find -exec lance perl à chaque fois, mais j'avais
la flemme de tapper

find . -name *.tex -print0 | xargs -0 -n 100 perl ...

Pour gérer correctement les caractères spéciaux dans les noms de
fichiers et les cas ou le nombre de fichiers à traiter est plus grand
que le nombre d'arguments maximum sur une ligne de commande ;-)

--
Matthieu