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.