Ott
29

Come sostituire automaticamente una stringa su uno o più file con sed per Linux

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" {} \;

3 commenti a “Come sostituire automaticamente una stringa su uno o più file con sed per Linux”


  1. 1 Vincenzo Pisano
    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

  2. 2 Paolo Gatti
    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.

  3. 3 Matteo Croce
    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

Lascia un commento

Nome

Email (non verrà pubblicata)

Sito web (opzionale)

Quanto fa 1 + 5 ? (protezione antispam)





Hai bisogno di un sito web?

Web&Dintorni

Vuoi collaborare a questo blog?

Ogni tipo di collaborazione è benvenuta!


Scrivimi all'indirizzo paolo.gatti@gmail.com o invia un messaggio sulla pagina Facebook!