2011-11-21 14 views
14

Sono completamente nuovo a Bash ma proprio non riesco a trovare un modo per farlo fare quello che voglio.BASH: programma ricorsivo per sostituire il testo in un albero di file

Immaginate di avere una directory albero con 2 file: /top.php e /test/bottom.php

Come faccio la mia funzione sguardo e sostituire dire "ciao" in "Bonjour" in/top .php AND in /test/bottom.php?

Finora l'unico modo che ho trovato per farlo è chiamando la stessa funzione per due volte con un diverso livello di profondità:

find ./*.php -type f -exec sed -i 's/hello/bonjour/' {} \; 
find ./*/*.php -type f -exec sed -i 's/hello/bonjour/' {} \; 

Sicuramente c'è un modo ricorsivo per fare questo in una linea?

+0

possibile duplicato di [Awk/Sed: come fare un recursi hai trovato/sostituisci una stringa?] (http://stackoverflow.com/questions/1583219/awk-sed-how-to-do-a-recursive-find-replace-of-a-string) – Pureferret

risposta

36

Utilizzare un modello reale per trovare invece della shell espansione jolly:

find . -name '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \; 
+0

Il tuo ha funzionato perfettamente ! Lo svuoterei se potessi, ma non ho ancora la quantità richiesta di reputazione – Audioy

+1

@Erken: Grazie. Dovresti avere la reputazione di accettare la risposta (il segno di spunta sotto il numero di voti). Qual è la risposta corretta se funziona, comunque :-). – thiton

+0

Perfetto, capito! Grazie mille ragazzi, siete stati incredibilmente veloci !! oO – Audioy

-2

Utilizzare xargs e grep:

find . -type f | grep php$ | xargs -n1 -i sed -i 's/hello/bonjour/' {} 

Ecco come funziona:

trovare tutti i file in-e -Include la directory corrente:

find . -type f 

Includere solo quei file che terminano in php:

grep php$ 

Prendere ogni linea e applicarlo sed ad esso:

xargs -n1 -i sed -i 's/hello/bonjour/' {} 
+2

tranne che non funziona (si consideri il nome di file con spazi) – sehe

+0

Prima di tutto, non inserire spazi nei nomi dei file! :) In secondo luogo, basta citare-racchiudere la parte "{}" e dovresti essere ok. –

+3

No. Grep/xargs ucciderà i tuoi cuccioli. – sehe

2

prossimità:

find -iname '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \; 

O

find -iname '*.php' -type f -print0 | 
    xargs -0 sed -i 's/hello/bonjour/' 
+0

la prima soluzione che hai dato non ha funzionato.Non ho provato il secondo, ma la soluzione data da thiton era più diretta. – Audioy

+0

@Erken: questo perché nella directory principale c'erano più file della domanda descritta. Impara a citare i tuoi jolly se non li vuoi espandere. – sehe

+0

Gotcha! Grazie – Audioy

Problemi correlati