Ieri mi è capitato di dover sostituire una stringa di codice PHP, presente in diversi file contenuti nella stessa directory, con un’altra stringa.
Essendo un fan della riga di comando *unix, ho deciso di utilizzare sed, non prima di una ripassatina veloce al man(uale), per ricordare la sintassi di utilizzo, che è la seguente:
sed -e "s/VECCHIASTRINGA/NUOVASTRINGA/g" *.ESTENSIONE
dove, VECCHIASTRINGA e NUOVASTRINGA penso si commentino da sole, mentre ESTENSIONE deve essere sostituita con l’estensione dei file da sostituire. Nel caso in cui la sostituzione coinvolgesse tutti i file, è possibile indicare *.* !
Grazie a questo semplice comando, tutti i file sono stati modificati velocemente e correttamente.
P.S. sicuramente qualcuno di voi si starà chiedendo “e se i file sono sparsi in sottocartelle come faccio?”. La risposta è presto detta:
find . -type f -name '*.ESTENSIONE' -exec sed -e "s/VECCHIASTRINGA/NUOVASTRINGA/g" {} \;
26 Febbraio 2013 alle 14:15 Quota
Bel suggerimento, Paolo! complimenti. L’ho utilizzato per effettuare la sostituzione di file fisicamente sul file system. Ma lanciando l’ultimo comando come da te esaurientemente esposto, la sistituzione avviene a video. Il comando l’ho personalizzato per la mia problematica, così:
find . -type f -name ‘*.sh’ -exec sed -e “s/file_watcher_xi/file_watcher_xi31/g” {} \;
la sostituzione funziona, ma l’output lo vedo, appunto, a video. Come posso fare per sostituire fisicamente i file origine?
Grazie!
Vincent
26 Febbraio 2013 alle 14:21 Quota
ciao Vincenzo, sed -i dovrebbe risolvere il tuo problema! Prima fai un backup dei file ovviamente! :)
Ciao, Paolo.
30 Maggio 2016 alle 21:56 Quota
*.* è un refuso microsoft, funziona solo sui file che hanno un punto nel nome, non funzionerà per esempio su “readme” e “license”
Meglio usare solo * :P