[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: