web-dev-qa-db-fra.com

remplacer un texte particulier dans tous les fichiers à l'aide d'une commande Shell à une seule ligne

j'ai un fichier JS renommé que je dois appeler dans chacune de mes pages php. Maintenant, je veux remplacer cet ancien nom par le nouveau utilisant Shell . Ce que iam utilise est le suivant: -

sed -i ’s/old/new/g’ *

mais cela donne l'erreur suivante: -

sed: -e expression #1, char 1: unknown command:

maintenant, comment puis-je faire ce remplacement?

29
developer

Il y a probablement moins de solutions verbeuses, mais on y va:

for i in *; do sed -i 's/old/new/g' "$i"; done

Attention, cela ne fonctionnera que sur le niveau actuel du système de fichiers, les fichiers des sous-répertoires ne seront pas modifiés. En outre, vous voudrez peut-être remplacer * par * .php ou faire des sauvegardes (passez un argument après -i et vous ferez une sauvegarde avec l'extension donnée).

26
K. Norbert
sed -i.bak 's/old/new/g' *.php

le faire récursivement

find /path -type f -iname '*.php' -exec sed -i.bak 's/old/new/' "{}" +;
45
ghostdog74

Vous utilisez des apostrophes Unicode (marque de citation droite - U2019) au lieu de ASCII (0x27) apostrophes autour de votre argument de commande sed.

9
Dennis Williamson

celui-ci est très simple, sans boucle for, et prend en charge tout nombre ou répertoires imbriqués 

grep -rl 'oldText' [folderName-optional] | xargs sed -i 's/oldText/newText/g'

5
user7154703
Perl -pi -e 's/old/new/g' *.php
4
radio4fan

Pour être complet, fournir la version compatible OSX de la réponse acceptée ci-dessus (pour répondre aux commentaires de @jamescampbell)

for i in *.php; do sed -i .orig 's/old/new/g' "$i"; done

Cette commande crée des fichiers de sauvegarde .orig.

2
shiramy

Je sais que je suis vraiment en retard mais quand même: 

find . -type f -name "*.php"|xargs sed -i 's/old/new/g'
2
Ziyad

Utilisez les guillemets doubles

sed -i "s/old/new/g" *
0
Vikas Mulaje