Re: remplacement occurence dans plusieurs fichiers
Metaone a écrit, mercredi 26 novembre 2003, à 09:13 :
> Wallace wrote:
> >Bonjour,
bonjour.
> > [déplacement de gallery]
>
> A tester avant de faire la commande !!! :
[...]
> 1- on crée un petit script shell qui contient la commande:
>
> cat "$1" | sed
Laisse dormir le chat, « cat "$1" | sed » == « <"$1" sed »
> "s/\/home\/toto\/gallery\//\/home\/sites\/toto\/gallery\//g" > "$1"
>
> $1 étant le premier argument de la commande (donc ici, un nom de fichier).
$1 ouvert en écriture pour sed écrasera la version précédente lue par
cat ... avec sed v.3, il faut passer par un fichier temporaire :
mv fichier fichier.orig && sed -e 'modifs' <fichier.orig >fichier
Sed version 4 (il y a un backport pour woody sur www.backports.org ou
via www.apt-get.org [1]) dispose de l'option -i de Perl :
sed -i.orig -e '<modifs>' fichier
ou idem avec perl, mais
$ ls -l $(which sed perl)
33544 oct 26 17:01 /bin/sed
774947 aoû 10 03:19 /usr/bin/perl
> sed s/toto/foo/g : remplace toutes les occurences de toto par foo (le g
> c'est pour remplacer toutes les occurences sur une même ligne, sans le g
> il ne remplacera que la premiere occurence de chaque ligne)
ici, sed 's!avant!après!g' serait plus lisible sans \/
[...]
> 3-- pour chaque fichier de l'arborescence on execute la commande (man find).
> $ find . -type f -exec ./cmd {} \;
a/ Ce truc-là va s'attaquer à *tous* les fichiers ordinaires, y compris
les photos ; les *.jpeg peuvent
- être gros ;
- contenir des noms de fichier dans le champ EXIF ...
il faudrait donc rajouter l'option find « -name '*.html' ».
b/ Find lance une commande par fichier.
un truc du genre :
sed -i.orig -e 's!avant!après!g' *.html
devrait déjà traiter d'un seul coup les fichiers utiles du répertoire
courant.
Pour le côté récursif, le shell zsh le permet directement dans la
commande précédente, apt-get install zsh-doc [2].
Sinon, il faudrait écrire le script perl correspondant, ou jouer avec
les options de find,
find repert -type d -exec sh -c "sed -i.orig -e '<modifs>' {}/*.html" \;
Essaie avec « echo sed ... » d'abord.
> ps: fais une copie du site et lance la commande SUR LA COPIE
Oui.
Notes :
[1], [2] : comme ça je suis en charte ;)
--
Jacques L'helgoualc'h
Reply to: