Apakah ada cara untuk menjalankan pencarian rekursif dan mengganti menggunakan sed
, sebelum benar-benar menjalankannya? Saya hanya ingin mencetak hasilnya sebelum benar-benar melakukan pencarian dan ganti. Sesuatu seperti menggemakan hasil,
grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
Jawaban:
Anda dapat menjalankan
sed
tanpa-i
dan melangkah melalui output denganless
Kemudian jalankan
sed
dengan-i.bak
untuk membuat cadangan yang dapat Anda bedakan sesudahnyaSunting: Seperti yang disarankan dalam komentar, gunakan
grep --null | xargs -0
. Ini menyebabkan nama file diakhiri oleh byte-nol, yang membuatnya aman untuk nama file dengan karakter yang tidak biasa seperti baris baru. Ya,\n
adalah karakter yang valid dalam nama file unix. Satu-satunya karakter terlarang adalah slash/
dan karakter nul\0
sumber
grep -rl --null
karena OP tidak menentukan OS, dan-Z
berarti sesuatu yang berbeda pada BSD / OSX (dekompresi).--null
sama pada GNU dan BSDgrep
(garpu) GNU grep pada FreeBSD dan NetBSD. Di NetBSD,-Z
masih berarti--null
(menurut halaman manual), tapi saya setuju --null lebih portabel. Perhatikan juga bahwa --null maupun -Z tidak bekerja pada OpenBSDsed -i '' -e s/.../
di BSDsed
(tidak ada opsi opsional di sana)Gunakan
sed
denganfind
alih - alihgrep
Pertama-tama, saya akan mempekerjakan
find
daripadagrep
, dan ini karena tiga alasan bagus:find
memungkinkan untuk pemilihan file yang lebih tepat. Misalnya,grep -r string *.txt
akan menghasilkan file hanya di direktori saat ini; bukan yang ada di subdirektori.find
hadir dengan-exec
opsi kuat yang menghilangkan kebutuhan untuk keseluruhan--null … |xargs 0
konstruksi.-readable
dan-writable
opsifind
akan mencegah membuang-buang waktu pada file yang tidak dapat diakses.Tes pengambilan
Yang mengatakan,
grep
apakah cocok untuk tes pertama untuk melihat apa yang akan ditangkap:atau lebih khusus:
Lari kering
Sekarang, lanjutkan dengan
sed
lari kering. Thesed
pilihan-n
adalah sinonim untuk--quiet
danp
di akhir darised
ekspresi akan mencetak ruang pola arus.atau lebih khusus:
Eksekusi
Jika semuanya terlihat baik-baik saja, keluarkan perintah definitif dengan mengganti
sed
opsi-n
dengan-i
untuk "di tempat" dan dengan menghapusp
di akhir.atau lebih khusus:
Lebih banyak
find
contohLebih banyak
find
contoh dapat ditemukan di sini .sumber