Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1736 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°289619
Olivier51
Posté le 06-07-2003 à 23:15:17  profilanswer
 

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 ...

mood
Publicité
Posté le 06-07-2003 à 23:15:17  profilanswer
 

n°289637
Olivier51
Posté le 07-07-2003 à 00:47:12  profilanswer
 

:non:

n°289693
Taz
bisounours-codeur
Posté le 07-07-2003 à 09:35:21  profilanswer
 

fo passer par un ficheir temporaire  :ouch:

n°289742
arsunik
ma tuxitude me beastifie
Posté le 07-07-2003 à 11:24:17  profilanswer
 

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
}

n°289755
Taz
bisounours-codeur
Posté le 07-07-2003 à 11:42:55  profilanswer
 

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?

n°289783
Olivier51
Posté le 07-07-2003 à 12:57:28  profilanswer
 

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

n°289784
Olivier51
Posté le 07-07-2003 à 12:58:20  profilanswer
 

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

 

n°289786
Taz
bisounours-codeur
Posté le 07-07-2003 à 12:59:07  profilanswer
 

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

n°289803
cycojesus
Mèo Lười
Posté le 07-07-2003 à 13:25:33  profilanswer
 

: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/
n°289805
Taz
bisounours-codeur
Posté le 07-07-2003 à 13:26:36  profilanswer
 

non  :??:

mood
Publicité
Posté le 07-07-2003 à 13:26:36  profilanswer
 

n°289808
cycojesus
Mèo Lười
Posté le 07-07-2003 à 13:30:11  profilanswer
 

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/
n°289818
arsunik
ma tuxitude me beastifie
Posté le 07-07-2003 à 13:51:25  profilanswer
 

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.

n°289821
Taz
bisounours-codeur
Posté le 07-07-2003 à 13:55:44  profilanswer
 

effectivemet, que des remarques judicieuses

n°289822
arsunik
ma tuxitude me beastifie
Posté le 07-07-2003 à 13:57:53  profilanswer
 

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:

n°289824
cycojesus
Mèo Lười
Posté le 07-07-2003 à 14:01:03  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

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

 

Sujets relatifs
Syntaxe pour accéder à un répertoire partagé Windows depuis Linux...fichiers caches macx
[gnuplot] tracé entre deux fichiers...Passage en minuscule du contenu des fichiers d'un repertoire
Manager graphique de fichiers...faire un chown d'une liste de repertoire ...
[réglé] RedHAt9 reinstaller perl??? j'ai perdu des fichiers[Windows 98 SE] Comment désinstaller DirectX pour le remplacer?
[Linux] root qui ne peut pas supprimer/modifier un répertoire ... 
Plus de sujets relatifs à : Remplacer un mot par un autre dans tous les fichiers du répertoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR