2010-03-26 13 views

risposta

24

Probabilmente ci sono soluzioni meno prolissa, ma qui andiamo:

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

Intendiamoci, funzionerà solo sul livello attuale del file system, file nelle sottodirectory non verrà modificato. Inoltre, potresti voler sostituire * con * .php, o fare i backup (passare un argomento dopo -i, e farà un backup con l'estensione specificata).

+0

hmm. su OSX ho ottenuto il comando "mi aspetto" seguito da un testo " – jamescampbell

-2

Prova questo:

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 sono inutili. 'per file in * .php; do ....; done' – ghostdog74

+1

Non so di inutili - ma è un approccio molto brutto, quindi c'è il fatto che l'uso di un nome file temporaneo fisso (files.txt, TMPfile.php) si interromperà se c'è qualche concorrenza. – symcbean

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

ha ottenuto un errore su OSX 'zsh: elenco di argomenti troppo lungo: perl' – jamescampbell

+0

Appena testato su zsh OSX e funziona per me. – radio4fan

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

per farlo in modo ricorsivo

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

Questo dà l'errore "TROVA: interruttore non valido" –

8

Si utilizza apostrofi Unicode (DESTRA SINGOLA virgoletta - u2019) invece di ASCII (0x27) apostrofi attorno all'argomento del comando sed.

0

questo è molto semplice, senza favore o loop, un prendersi cura di qualsiasi numero o directory nidificate

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

Problemi correlati