Search and replace in file
In un progetto recente mi è capitato di dover modificare al volo uno stesso parametro in molteplici file di configurazione.
Più in dettaglio, avrei dovuto modificare il valore dell’elemento <data>.
La soluzione si basa su una serie di istruzioni bash.
# si ottiene il numero di occorrenze da sostituire
$ grep -r '4010' /path/file/configurazione | wc -l
# le occorrenze vengono sostituite
$ find . -maxdepth 1 -name "param*.xml" -exec sed -i 's/4010/3010/g' {} \;
# si verifica che le occorrenze sostituite siano uguali a quelle trovate nella situazione iniziale
$ grep -r '3010' . | wc -l
Più in dettaglio, ecco la successione di operazioni che ho eseguito.
# listing file nel path
~/tmp/param$ ls
param1.xml
param2.xml
param3.xml
...
# search: quante volte occorre la stringa da sostituire?
~/tmp/param$ grep -r '4010' . | wc -l
10
# search: in quali file occorre la stringa da sostituire?
~/tmp/param$ grep -r '4010' .
./param1.xml: <data>40100328000000</data>
./param2.xml: <data>40100328000000</data>
./param3.xml: <data>40100328000000</data>
...
# il find e' corretto?
~/tmp/param$ find . -maxdepth 1 -name "param*.xml"
./param1.xml
./param2.xml
./param3.xml
...
# search/replace
~/tmp/param$ find . -maxdepth 1 -name "param*.xml" -exec sed -i 's/4010/3010/g' {} \;
# verifica: replace quante volte?
~/tmp/param$ grep -r '3010' . | wc -l
10
# verifica: replace in quali file?
~/tmp/param$ grep -r '3010' .
./param1.xml: <data>30100328000000</data>
./param2.xml: <data>30100328000000</data>
./param3.xml: <data>30100328000000</data>
...

