Remplacer un mot par un autre dans tous les fichiers du répertoire

Remplacer un mot par un autre dans tous les fichiers du répertoire - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 06-07-2003 à 23:15:17    

Je cherche à faire un script qui me remplacerait dans tous les fichiers d'un répertoire un mot par un autre mot.
 
Je sais que j'ai déjà vu un script qui faisait ça, mais impossible de le retrouver.
 
J'ai été voir du côté de sed, mais j'arrive à le faire seulement sur un fichier, je me suis crée un script pour le faire sur un fichier :
 

Code :
  1. #!/bin/sh
  2. cat $1|sed -e "s/$2/$3/g" > $1


 
Mais je ne vois pas comment le faire pour tous les fichiers du répertoire ...

Reply

Marsh Posté le 06-07-2003 à 23:15:17   

Reply

Marsh Posté le 07-07-2003 à 00:47:12    

:non:

Reply

Marsh Posté le 07-07-2003 à 09:35:21    

fo passer par un ficheir temporaire  :ouch:

Reply

Marsh Posté le 07-07-2003 à 11:24:17    

Qq chose du genre :
 
replace () {
        local i j
        i="$1"  
        j="$2"  
        shift 2
        for k in "$@"
        do
                perl -pe "\$a='$i'; \$b='$j'; s:\$a:\$b:g" "$k" > "$k".tmp && mv -f "$k".tmp "$k"
        done
}

Reply

Marsh Posté le 07-07-2003 à 11:42:55    

pas la peine de passer par du perl. pour le fichier temporaire tu prends un nom avec mktemp
 
tmp= $(mktemp)
cat $1 | sed -e "s/$2/$3/g" > $tmp  
mv $tmp $1
 
non?

Reply

Marsh Posté le 07-07-2003 à 12:57:28    

Je pense que :

Code :
  1. #!/bin/sh
  2. cd $1;
  3. for file in `ls` do ;
  4. cat $file|sed -e "s/$2/$3/g" > $file;
  5. done

 
... fera l'affaire, il faut que je teste

Reply

Marsh Posté le 07-07-2003 à 12:58:20    

Plutôt ça d'ailleur :

Code :
  1. #!/bin/sh
  2. for file in `ls $1` do
  3. cat $file|sed -e "s/$2/$3/g" > $file; 
  4. done

 

Reply

Marsh Posté le 07-07-2003 à 12:59:07    

putain, on vous dit qu'il faut passer par un ficheir temporaire bordel!!!!!!!

Reply

Marsh Posté le 07-07-2003 à 13:25:33    

:ouch: vous connaissez pas replace  :??:  
 

Code :
  1. replace "mot_d_origine_1" "remplacement_mot_1"  "mot_d_origine_2" "remplacement_mot_2" ...  "mot_d_origine_n" "remplacement_mot_n" --  /repertoire/*


 
EDIT : http://infodan.in2p3.fr/cgi-bin/man-cgi?replace+1
 
EDIT2 : http://replace.richardlloyd.org.uk/


Message édité par cycojesus le 07-07-2003 à 13:59:17

---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 07-07-2003 à 13:26:36    

non  :??:

Reply

Marsh Posté le 07-07-2003 à 13:26:36   

Reply

Marsh Posté le 07-07-2003 à 13:30:11    

je sais pas si c'est une commande de base ou si ça fait partie d'un obscur package, mais en tout cas c'est installé sur ma Slack 9.0 (et 8.1) et c'est très pratique pour nettoyé du code des noms de variables à la con qui trainent. Je l'avait trouvé par hasard en faisant un man replace désabusé, j'était sur le c*l quand il m'a sorti ça...


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Marsh Posté le 07-07-2003 à 13:51:25    

passer par mktemp est effectivement plus propre pour le fichier temporaire.
 
Pour ce qui est de l'utilisation du perl, j'avais fais ça uniquement afin d'empêcher l'utilisation des regexp dans la chaîne à remplacer. J'utilise souvent cette fonction et quoter tous les caractères spéciaux "[]*.(|)\..." serait vite pénible. Cela dit il existe d'autres solutions que le perl pour cela, on pourrait par exemple faire un "echo toto | sed -e 's:\(.\):\\\1:g'" pour protéger tous les caractères (comme je ne suis pas sur de l'ordre d'évaluation d'une expression par perl, ça serait peut-être même mieux).
Si vous voyez une meilleure solution, n'hésitez pas ;)
 
D'autre part, le '&&' sert a n'exécuter la commande qui suit que si la commande précédente s'est déroulée sans problème (i.e. renvoit un code de retour de 0).
Ainsi un
sed ... > $tmp  
mv $tmp $1
peut causer des pertes de données si le disk se remplit pendant le sed (ce qui arrive parfois avec les systèmes multi-utilisateur).
Il faut donc faire "sed ... > $tmp && mv $tmp $1"
 
Enfin, il est inutile de faire "cat fichier | sed ", c'est ce qu'on pourrait appeller en français une utilisation abusive de cat (Useless Use of Cat Award). Il convient de faire directement "sed fichier".
 
Pendant que j'y suis je note aussi une utilisation abusive de "ls" : il faut utiliser directement "*" et non "`ls`". De surcroit, l'utilisation de ls entraine des erreurs avec les noms de fichiers contenant des espaces.
De même, on n'écrit jamais $variable quand la variable contient un nom de fichier (qui contient potentiellemnt des espaces ou autre caractère "spécial" ) mais "$variable".
Pour plus de détails, je ne saurais que trop vous conseiller la lecture d'un bon livre sur le shell et les shell-script.

Reply

Marsh Posté le 07-07-2003 à 13:55:44    

effectivemet, que des remarques judicieuses

Reply

Marsh Posté le 07-07-2003 à 13:57:53    

cycojesus a écrit :

:ouch: vous connaissez pas replace  :??:  


 
Hmm connais pas, ça ne doit pas être une commande standard unix ça !
Après une petite recherche, c'est un programme livré avec mysql  :lol:

Reply

Marsh Posté le 07-07-2003 à 14:01:03    

ArSuniK a écrit :


 
Hmm connais pas, ça ne doit pas être une commande standard unix ça !
Après une petite recherche, c'est un programme livré avec mysql  :lol:
 

oué, je viens de voir ça. J'avoue que sur le moment je me suis pas demander d'où ça venait...
 
sinon je sais pas si c'est la même chose que ça : http://replace.richardlloyd.org.uk/ (premier truc sorti par freshmeat)


---------------
Chết rồi ! ✍ ⌥⌘ http://github.com/gwenhael-le-moine/slackbuilds/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed