Search & Replace su più file da riga di comando

Tags: 

Se vogliamo sostituire del testo su tutti i file che contengono il testo originale all'interno di un percorso possiamo fare in questo modo:

grep -RlZ "TESTO_ORIGINALE" . | xargs -0 -l sed -i -e 's/TESTO_ORIGINALE_ESC/TESTO_DA_SOSTITUIRE_ESC/g'

Per *_ESC intendo che il testo deve considerare l'escaping delle "/".

Ad esempio:

grep -RlZ "/system_home/eric/" . | xargs -0 -l sed -i -e 's/\/system_home\/eric\//\/home\/eric_arch\//g'

Sostituisce tutti i /system_home/eric/ con /home/eric_arch/.

Il grep iniziale è una ottimizzazione per evitare di fare il search & replace di tutti i file. Per vedere se sta estranendo i file giusti:

grep -RlZ "/system_home/eric/" . | xargs -0 -l echo

Se si ha necessità di fare una ricerca usando espressioni regolari si può valutare l'uso di egrep invece di grep.

egrep -lRZ "\.jpg|\.png|\.gif" . | xargs -0 -l sed -i -e 's/\.jpg\|\.gif\|\.png/.bmp/g'

Se invece vogliamo fare il search & replace solo su certi file, ottenibili tramite un find, possiamo usare questa forma:

find . -name *.txt -exec sed -i "s/SEARCH/REPLACE/" {} \;

Fa un replace su tutti i file .TXT

Aggiungi un commento

Scrivi la risposta in lettere (ad esempio "tre" e non "3")