Anda dapat menggunakan find
dan -exec
langsung ke sed
daripada pertama-tama menemukan oldstr
dengan grep
. Ini mungkin sedikit kurang efisien, tapi itu mungkin tidak penting. Dengan cara ini, sed
penggantian dijalankan atas semua file yang terdaftar oleh find
, tetapi jika oldstr
tidak ada itu jelas tidak akan beroperasi di atasnya.
find /path -type f -exec sed -i 's/oldstr/newstr/g' {} \;
Solusi Anda baik-baik saja. coba saja dengan cara ini:
files=$(grep -rl oldstr path) && echo $files | xargs sed....
jadi jalankan xargs
hanya ketika grep mengembalikan 0
, mis. ketika menemukan string di beberapa file.
Saya telah mengambil ide Vlad dan mengubahnya sedikit. Alih-alih
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null
Yang menghasilkan
sed: couldn't edit /dev/null: not a regular file
Saya melakukan 3 koneksi berbeda ke server jarak jauh
touch deleteme
grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' ./deleteme
rm deleteme
Meskipun ini kurang elegan dan membutuhkan 2 koneksi lagi ke server (mungkin ada cara untuk melakukan semuanya dalam satu baris) ini juga berfungsi dengan efisien