Saya menjalankan yang berikut ini untuk mengganti istilah yang digunakan dalam semua file di direktori kerja saat ini:
$ find . -type f -print0 | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'
Ini melakukan substitusi kata tetapi juga membuat .bup
file file yang tidak pernah memiliki Ms. Johnson
string.
Bagaimana saya melakukan penggantian tanpa membuat semua cadangan yang tidak perlu ini?
linux
shell-script
scripting
sed
Belmin Fernandez
sumber
sumber
ex
, dan kondisional (hanya jika file diubah) berjalan:!cp '%' '%.bup'
sebelum menyimpan dan keluar. Mungkin layak untuk dilihat.vi
pertukaran stack.Jawaban:
Anda dapat memeriksa konten file untuk memastikan bahwa akan terjadi substitusi ketika
sed
beroperasi di dalamnya:Jika Anda ingin benar-benar pandai tentang hal itu, Anda bisa melepaskannya
find
sama sekali:sumber
'{}'
sebelum Anda\;
dalam hal itu-exec
.Find memiliki
-exec
operator yang mengeksekusi perintah arbitrer. Yang lebih baik lagi-exec
adalah tes , jadi Anda dapat membuat beberapa rantai menjadi-exec
satu, dan jika perintah sebelumnya gagal, yang kemudian tidak akan dieksekusi. String{}
akan diganti dengan nama file saat ini, dan;
menandai akhir perintah. Anda harus mengutip keduanya untuk menghindari campur tangan shell.Begitu:
sumber
{}
ke string nol saat melakukan ekspansi penjepit.Saya melihat halaman manual dan tidak melihat cara untuk melakukannya secara langsung
sed
, seperti yang saya yakin Anda lakukan sebelum bertanya. Saya melihat beberapa cara untuk mengatasi ini menggunakan grep, tapi saya pikir yang paling mudah adalah ini:-r
recurse-l
nama file cetak hanya-Z
berakhir nama dengan nolsumber
Sepertinya Anda perlu membuat daftar file yang cocok dengan istilah pencarian Anda terlebih dahulu.
sumber
.
argumen pertamafind
. Juga, seperti yang saya informasikan pada diri saya sendiri belum lama ini, Anda sebenarnya tidak perlu mengutip atau melarikan diri{}
find
menghasilkan daftar file yang dipisahkan baris baru, kemudian shell memecah daftar ini di spasi putih (bukan hanya baris baru) dan kemudian shell memperlakukan setiap kata sebagai pola gumpalan. Ini hanya berfungsi jika nama file Anda tidak mengandung spasi atau\[?*
. Jawaban lain pada halaman ini menunjukkan bagaimana melakukan ini dengan benar..
perlu dengan find (setidaknya find ditemukan di linux) karena diasumsikan ketika tidak ada path yang melewati argumen.