web-dev-qa-db-fra.com

rechercher et remplacer une chaîne sur plusieurs fichiers à partir d'un terminal unix

Nous convertissons toutes les pages html statiques de notre base de code en pages php. La première étape serait de changer toute l’extension de fichier .html en .php (ce que j’ai déjà fait). La deuxième étape consisterait à mettre à jour tous les liens au sein de chacune de ces pages HTML pour pointer vers de nouvelles pages php. 

(par exemple, dans index.php, j'ai des liens vers contact.html et sur-us.html. Maintenant que nous avons remplacé toutes les extensions de fichier .html par .php, nous devons remplacer contact.html par contact.php, et de même, about-us.html à about-us.php).

ce que je veux faire maintenant est de rechercher une chaîne particulière sur plusieurs fichiers. (recherchez "contact.html" dans de nombreux fichiers, tels que index.php, index2.php, index3.php, etc.), remplacez tous les "contact.html" dans tous ces fichiers par "contact.php ".

Je ne connais pas bien la ligne de commande unix, et jusqu'à présent, j'ai vu des questions similaires posées par d'autres personnes dans le forum, mais je ne comprends pas très bien laquelle pourrait m'aider à réaliser ce que je veux. J'utilise cygwin et si possible, je dois résoudre ce problème sans script Perl car je ne l'ai pas installé. J'ai besoin d'essayer d'utiliser sed, grep, find ou n'importe quoi d'autre.

Donc, si certains d'entre vous pensent qu'il s'agit d'un doublon, veuillez me diriger vers un poste pertinent. Merci pour votre temps.

19
Benny Tjia

Essaye ça:

find . -name '*.html' -exec sed -i 's/\.html/\.php/g' "{}" \;

Il trouvera tous les fichiers dans le sous-répertoire courant et les sous-répertoires se terminant par .html et exécutera sed sur chacun d’entre eux pour remplacer .html par .php partout où il figurera.

Voir http://content.hccfl.edu/pollock/unix/findcmd.htm pour plus de détails.

34
Adam Liss

Sur mon Mac, j'ai dû ajouter un paramètre à l'option -i: l'extension à ajouter au nom (dans ce cas, rien, le fichier est donc stocké sur place).

find . -name '*.html' -exec sed -i '' 's/\.html/\.php/g' "{}" \;
14
Fabruccio
You can certainly use ack to select your files to update. For example,
to change all "foo" to "bar" in all PHP files, you can do this from 
the Unix Shell: 

Perl -i -p -e's/foo/bar/g' $(ack -f --php)

Source: man ack

1
user649198

Le script ci-dessous peut aider à remplacer la chaîne dans les fichiers:

#!/bin/bash
echo -e "please specify the folder where string has need to be replaced: \c"
read a
echo -e "please specify the string to be replaced: \c"
read b
echo -e "please specify the string: \c"
read c
find $a -type f -exec sed -i 's/'"$b"'/'"$c"'/g' {} \; > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "string has been replaced..."
else                                                                         echo "String replacement has been failed"
exit0
fi
0
Nishanth

Cela a fonctionné pour moi:

find . -type f -print0 | xargs -0 sed -i 's/str1/str2/g'

0
alex

Cela devrait fonctionner (trouvé ici: http://www.mehtanirav.com/search-and-replace-recursively-using-sed-and-grep/ ):

for i in `find . -type f` ; do sed "s/html/php/g" "$i" >> "$i.xx"; mv "$i.xx" "$i"; done
0
jschorr