GNU/Linux >> Belajar Linux >  >> Linux

Grep String Dimana Baris Berikutnya Tidak Mengandung String?

Saya ingin mencari semua file di dalam direktori dan subdirektori untuk baris yang berisi string tertentu, tetapi saya ingin mengecualikan hasil yang berisi string tertentu yang berbeda di baris segera setelahnya.

Misalnya, ini:

foo1 searchString bar
foo1 excludeString bar

foo2 searchString bar
something else

foo3 searchString bar

foo3 excludeString bar

foo4 searchString bar

harus mengembalikan ini:

foo2 searchString bar
foo3 searchString bar
foo4 searchString bar

Saya tahu bahwa -A mencetak beberapa baris, dan -v tidak termasuk hasil. Tapi pendekatan saya saat ini untuk grep -r -A 1 "searchString" | grep -v "excludeString" jelas tidak bisa.

Apakah ada cara untuk memberi tahu grep kedua bahwa itu juga harus menghapus baris sebelumnya jika menemukan kecocokan? Atau cara lain bagaimana saya bisa mencapai ini?

Performa bukanlah perhatian utama saya; Akan lebih baik jika perintahnya relatif mudah diingat.

Jawaban yang Diterima:

Anda dapat menggunakan p erl c r . yang kompatibel biasa e ekspresi grep :

$ pcregrep -M '(searchString.*\n)(?!.*excludeString)' file
foo2 searchString bar
foo3 searchString bar
foo4 searchString bar

Ia mencari searchString diikuti oleh sembarang karakter . , diulang nol kali atau lebih * , diikuti oleh baris baru \n hanya jika ada tidak (?! ) pola .*excludeString di sebelahnya. Opsi -M hadir untuk mencocokkan banyak baris.


Linux
  1. Bagaimana Cara Grep Garis Yang Tidak Dimulai Dengan "#" Atau ";"?

  2. Mengapa File Terjemahan Bash Tidak Berisi Semua Teks Kesalahan?

  3. Bagaimana Menemukan Semua File Yang Tidak Mengandung String Teks?

  1. Vsftpd Tidak Mencantumkan Konten Direktori?

  2. Mengapa `keluar &` Tidak Berfungsi?

  3. CentOS/RHEL:Perintah Mount Gagal Dengan "mount:tidak mengandung label SELinux"

  1. grep:perintah tidak ditemukan

  2. Apakah \d tidak didukung oleh ekspresi dasar grep?

  3. temukan teks yang cocok dan ganti baris berikutnya