sed - sostituzione - Come trovare e sostituire tutte le occorrenze di una stringa in modo ricorsivo in un albero di directory?




sed sostituzione stringa (5)

è molto più semplice di così.

for i in `find *` ; do sed -i -- 's/search string/target string/g' $i;

fatto

find i => introdurrà tutti i file nella cartella e nelle sottocartelle di SED.

sed -i => sostituirà nei file la stringa pertinente se esiste.

Usando solo grep e sed, come posso sostituire tutte le occorrenze di:

a.example.com

con

b.example.com

all'interno di un file di testo sotto l'albero /home/user/ directory ricorsivamente ricerchiando e sostituendo tutte le occorrenze in tutti i file nelle sottodirectory pure.


Il comando seguente cercherà tutti i file in modo ricorsivo il cui nome corrisponde al modello di ricerca e sostituirà la stringa:

find /path/to/searchdir/ -name "serachpatter" -type f | xargs sed -i 's/stringone/StrIngTwo/g'

Inoltre, se vuoi limitare la profondità della ricorsione puoi mettere anche i limiti:

find /path/to/searchdir/ -name "serachpatter" -type f -maxdepth 4 -mindepth 2 | xargs sed -i 's/stringone/StrIngTwo/g'


Prova questo comando:

/home/user/ directory - find ./ -type f \
-exec sed -i -e 's/a.example.com/b.example.com/g' {} \;

Prova questo:

grep -rl 'SearchString' ./ | xargs sed -i 's/REPLACESTRING/WITHTHIS/g'

grep -rl cercherà ricorsivamente il SEARCHSTRING nelle directory ./ e sostituirà le stringhe usando sed .

Ex:

Sostituire un nome TOM con JERRY usando la stringa di ricerca come SWATKATS nella directory CARTOONNETWORK

grep -rl 'SWATKATS' CARTOONNETWORK/ | xargs sed -i 's/TOM/JERRY/g'

Questo sostituirà TOM con JERRY in tutti i file e sottodirectory in CARTOONNETWORK ovunque trovi la stringa SWATKATS .


So che questa è una domanda molto vecchia, ma ...

  1. La risposta di @ vehomzzz usa find e xargs quando le domande dicono esplicitamente solo grep e sed .

  2. @EmployedRussian e @BrooksMoses hanno cercato di dire che era un dup di awk e sed , ma non lo è - di nuovo, la domanda dice esplicitamente solo grep e sed .

Quindi ecco la mia soluzione, assumendo che tu stia usando Bash come shell:

OLDIFS=$IFS
IFS=$'\n'
for f in `grep -rl a.example.com .` # Use -irl instead of -rl for case insensitive search
do
    sed -i 's/a\.example\.com/b.example.com/g' $f # Use /gi instead of /g for case insensitive search
done
IFS=$OLDIFS

Se stai usando una shell diversa, come Unix SHell, fammelo sapere e cercherò di trovare una regolazione della sintassi.

PS: Ecco un one-liner:

OLDIFS=$IFS;IFS=$'\n';for f in `grep -rl a.example.com .`;do sed -i 's/a\.example\.com/b.example.com/g' $f;done;IFS=$OLDIFS

fonti: