Remplacer un mot par un autre dans tous les fichiers du répertoire - Codes et scripts - Linux et OS Alternatifs
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
}
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?
Marsh Posté le 07-07-2003 à 12:57:28
Je pense que :
Code :
|
... fera l'affaire, il faut que je teste
Marsh Posté le 07-07-2003 à 12:58:20
Plutôt ça d'ailleur :
Code :
|
Marsh Posté le 07-07-2003 à 12:59:07
putain, on vous dit qu'il faut passer par un ficheir temporaire bordel!!!!!!!
Marsh Posté le 07-07-2003 à 13:25:33
vous connaissez pas replace
Code :
|
EDIT : http://infodan.in2p3.fr/cgi-bin/man-cgi?replace+1
EDIT2 : http://replace.richardlloyd.org.uk/
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...
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.
Marsh Posté le 07-07-2003 à 13:57:53
cycojesus a écrit : 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
Marsh Posté le 07-07-2003 à 14:01:03
ArSuniK a écrit : |
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)
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 :
Mais je ne vois pas comment le faire pour tous les fichiers du répertoire ...