Puoi usare find
e -exec
direttamente in sed
piuttosto che individuare prima oldstr
con grep
. Forse è un po' meno efficiente, ma potrebbe non essere importante. In questo modo, il sed
la sostituzione viene eseguita su tutti i file elencati da find
, ma se oldstr
non è lì ovviamente non funzionerà su di esso.
find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;
La tua soluzione è ok. provalo solo in questo modo:
files=$(grep -rl oldstr path) && echo $files | xargs sed....
quindi esegui xargs
solo quando grep restituisce 0
, per esempio. quando si trova la stringa in alcuni file.
Ho preso l'idea di Vlad e l'ho modificata un po'. Invece di
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
Che produce
sed: couldn't edit /dev/null: not a regular file
Sto facendo 3 diverse connessioni al server remoto
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
Anche se questo è meno elegante e richiede altre 2 connessioni al server (forse c'è un modo per fare tutto in una riga) fa anche il lavoro in modo efficiente