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