Menemukan dan menghapus baris dari semua file secara rekursif

14

Saya telah berhasil memahami kemunculan kata kunci dengan menggunakan

grep "KeyWord" . -r -n -i -I 

tetapi, kemunculan KeyWord terlalu besar. Saya hanya ingin menghapus semua baris yang mengandung kata itu.

Saya mencari-cari, sed sepertinya menjadi utilitas. Adakah yang bisa memberi tahu saya perintah apa yang akan melakukan trik?

Terima kasih.

SurenNihalani
sumber

Jawaban:

25

Dengan sed GNU:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

Dengan sed OSX:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

Perintah pertama findmenemukan semua file standar (bukan direktori, atau pipa, atau lain-lain), mencetaknya dengan dipisahkan \0(sehingga nama file dapat berisi spasi, baris baru, dll.).

Perintah kedua xargsmembaca output find, meraih daftar berdasarkan pemisah ( \0karena -0), memanggil sed -i [...]dengan parameter tambahan dari daftar ( sedakan dipanggil beberapa kali jika ada banyak file, karena panjang maksimum parameter dibatasi dalam setiap doa).

The sedperintah memodifikasi di tempat ( -i).

Adapun /KeyWord/d, itu akan menghapus baris yang berisi ekspresi reguler KeyWord.

Anda harus belajar sedmemahami sintaks (sederhana tetapi tidak biasa) dengan benar, dan merujuk ke halaman manual yang sesuai untuk informasi lebih lanjut tentang alat yang terlibat di sini.


Dan karena saya ingin mempromosikan zsh, solusi dengan gumpalan yang diperluas:

sed -i /KeyWord/d **/*(.)
Pierre Carrier
sumber
Bagaimana kalau hanya menghapus kata "kata kunci." dan bukan seluruh baris?
SurenNihalani
s/KeyWord//g(pengganti KeyWorddengan '' (string kosong), guntuk semua (tidak hanya yang pertama pada setiap baris)
Pierre Carrier
1

Anda dapat menggunakan Vim dalam mode Ex:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g pencarian global

  2. d menghapus

  3. x Simpan dan tutup

Steven Penny
sumber
di OSX yang memberi saya find: illegal option -- t, harus menambahkan. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik