2010-03-26 5 views

Répondre

24

Il y a probablement des solutions moins verbeux, mais on y va:

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

Rappelez-vous, il ne fonctionne que sur le niveau actuel du système de fichiers, les fichiers dans les sous-répertoires ne sera pas modifié. Aussi, vous pouvez remplacer * par * .php, ou faire des sauvegardes (passer un argument après -i, et il fera une sauvegarde avec l'extension donnée).

+0

hmm. sous OSX, j'ai 'la commande que j'attends \ suivie de texte' – jamescampbell

-2

Essayez ceci:

ls | grep "php" > files.txt 
for file in $(cat files.txt); do 
    sed 's/catch/send/g' $file > TMPfile.php && mv TMPfile.php $file 
done 
+2

ls/grep/cat sont inutiles. 'pour le fichier dans * .php; faire ....; done' – ghostdog74

+1

Ne sais pas à propos de inutile - mais c'est une approche très laide, puis il y a le fait que l'utilisation de nom de fichier temporaire fixe (fichiers.txt, TMPfile.php) va casser s'il y a une concurrence. – symcbean

3
perl -pi -e 's/old/new/g' *.php 
+0

a obtenu une erreur sur OSX 'zsh: liste d'arguments trop long: perl' – jamescampbell

+0

Juste testé sur zsh OSX et fonctionne pour moi. – radio4fan

40
sed -i.bak 's/old/new/g' *.php 

pour le faire récursive

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

Cela donne l'erreur "FIND: Invalid switch" –

8

Vous utilisez apostrophes Unicode (DROIT SIMPLE guillemet - u2019) au lieu de l'ASCII (0x27) apostrophes autour de votre argument de commande sed.

0

celui-ci est très simple, sans pour ou boucle, une prise en charge de prendre un certain nombre de répertoires imbriqués ou

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

Questions connexes