Vous vous trouvez sous Linux, vous désirez changer une chaîne de caractère avec une faute d’orthographe dans l’ensemble des fichiers d’un dossier? Utilisez le script suivant :
En Bref :
#!/bin/bash
for file in *.php
do
echo “Traitement de $file …”
sed -e “s/eMssage avec erreur/Message sans erreur/g” “$file” > “$file”.tmp && mv -f “$file”.tmp “$file”
done
Pour cela, ouvrir une console :
- cd /chemin/dossier (placez vous dans le dossier concerné)
- touch monscript.sh (créer un fichier vide nommé monscript)
éditez le fichier et collez le script ci-dessus en faisant les changement nécessaire
- ./monscript.sh (executer lescript en local)
Le principe :
for file in *.php
: Tous les fichiers du répertoire qui finissent par l’extension .
echo “Traitement de $file …”
: On indique leur nom__
sed -e “s/eMssage avec erreur/Message sans erreur/g” “$file” > “$file”.tmp && mv -f “$file”.tmp “$file”
: On substitue (s) le premier message par le deuxième message, à toutes les lignes (g). On applique cela à tous les fichiers que l’on traite actuellement, et on renomme les fichiers temporaires créés pour l’occasion
Plus d’info sur Sed.
Remplacer un texte dans des fichiers : Méthode évoluée
A présent je veux remplacer dans l'‘ensemble de mes fichiers .php la chaine <?
par la chaîne <?php
. Evidemment, je ne veux pas remplacer les bonnes chaînes déjà existantes, sinon j’aurai : <?<?php
ce qui ne sera pas bon.
Première méthode, je le fais à la bourrin, je remplace tous les <?
puis je remplace les <?<?
par <?
.
Deuxième méthode, je suis plus doux, et je vais : chercher les fichiers .php à modifer, effectuer la modification ciblée.
Pour trouver les fichiers à modifier :
find /rep -name "*.php" | xargs grep "<?[^php]"
_
Le principe : le find
permet de trouver les fichiers ayant l’extension .php. Le grep permet de trouver dans un fichier une expression donnée (ici <?
privée de php
à sa suite, voir expressions rationnelles). Le xargs
permet de lire les fichiers envoyé par le pipe de find
.
Si on a peur d’obtenir beaucoup de résultats on peux demander uniquement l’affichage du nom des fichiers en question :
find /rep -name "*.php" | xargs grep -l "<?[^php]"
… ou bien plus de précision en demandant l’affichage de la ligne :
find /rep -name "*.php" | xargs grep -n "<?[^php]"
Voici donc le script à utiliser pour la modification :
#!/bin/sh
old_value="<?";
new_value="<?php";
ignore_value="<?php";
SUCCESS=0
for file in $(find . -name "*.php")
do
echo "Traitment de : $file"
grep -q "$old_value" "$file"
if [ $? -eq $SUCCESS ]
# if grep -q "$word" "$filename" can replace lines 5 – 7.
then
mv $file $file.old2
sed "/$ignore_value/!s/$old_value/$new_value/g" < $file.old2 > $file
rm $file.old2
fi
done
Placer le dans le dossier sur lequel vous souhaitez faire le traitement, et executer. Pensez à sauver auparavant, sait-on jamais.