Sie können find
verwenden und -exec
direkt in sed
statt zuerst oldstr
zu suchen mit grep
. Es ist vielleicht ein bisschen weniger effizient, aber das ist vielleicht nicht wichtig. Auf diese Weise wird die sed
Die Ersetzung wird über alle Dateien ausgeführt, die unter find
aufgeführt sind , aber wenn oldstr
ist es nicht da, wird es offensichtlich nicht damit arbeiten.
find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;
Deine Lösung ist in Ordnung. versuche es nur so:
files=$(grep -rl oldstr path) && echo $files | xargs sed....
Führen Sie also xargs
aus nur wenn grep 0
zurückgibt , z.B. wenn die Zeichenfolge in einigen Dateien gefunden wird.
Ich habe Vlads Idee genommen und sie ein wenig verändert. Statt
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
Was
ergibtsed: couldn't edit /dev/null: not a regular file
Ich mache in 3 verschiedenen Verbindungen zum Remote-Server
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
Obwohl dies weniger elegant ist und 2 weitere Verbindungen zum Server erfordert (vielleicht gibt es eine Möglichkeit, alles in einer Zeile zu erledigen), erledigt es die Arbeit auch effizient