Bagaimana cara memfilter 2 baris untuk setiap baris yang cocok dengan grep regex?
ini adalah tes minimal saya:
SomeTestAAAA
EndTest
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestAABC
EndTest
SomeTestACDF
EndTest
Dan jelas saya mencoba misalnya grep -vA 1 SomeTestAA
yang tidak berhasil.
output yang diinginkan adalah:
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest
text-processing
grep
Behrooz
sumber
sumber
Jawaban:
Anda dapat menggunakan
grep
dengan-P
(PCRE):(?!AA)
adalah pola lookahead negatif lebar nol memastikan bahwa tidak adaAA
setelahSomeTest
.Uji :
sumber
\.
sogrep -P -A 1 'SomeTest\.(?!AA)' file.txt
orgrep -P -A 1 'SomeTest(?!\.AA)' file.txt
SomeTest*\nEndTest
OPs berpasangan sehingga Anda benar-benar melakukangrep
ping semua baris yang cocokSomeTest*
tetapi tidakSomeTestAA
+ satu baris konteks setelah pertandingan. Tambahkan beberapa baris lagi ke input (mis. Tambahkan barisfoobar
setelah setiapEndTest
baris) lalu coba lagi.Inilah
sed
solusi (-n
tanpa percetakan otomatis) yang berfungsi dengan input sewenang-wenang:demikian dengan input like
berlari
output
yaitu, ia menghapus persis garis yang
grep -A1 SomeTestAA infile
akan memilih:sumber
//
cocok/SomeTestAA/
. Saya pikir, dalam hal ini, itu akan cocok dengan ekspresi menegasikan:/SomeTestAA/!
. (+1)!
bukan bagian dari RE , itu adalahsed
hal.Anda mungkin lebih beruntung dengan sesuatu yang melihat wilayah multi-baris sebagai rekaman tunggal. Ada
sgrep
yang belum banyak saya gunakan.Ada juga awk, di mana Anda dapat mengatur pemisah catatan input, dan pemisah catatan keluaran, apa pun yang Anda suka.
Sebagian besar program awk adalah tanda kutip tunggal, tetapi saya mengubah menjadi tanda kutip ganda di akhir sehingga
$pat
variabel shell dapat diperluas.sumber
awk -vpat="^SomeTestAA" -vRS="\nEndTest\n" 'BEGIN{ ORS=RS } $0 !~ pat' file
Salah satu pilihan adalah untuk penggunaan
p
Erlc
ompatibler
egulare
Xpressiongrep
:Opsi ini
-M
memungkinkan pola untuk mencocokkan lebih dari satu baris.sumber
grep
sudah mendukung PCRE (melalui-P
opsi), apa keuntungan menggunakanpcregrep
?grep
sendiri tidak mendukung-M
opsi.Menggunakan standar
sed
:The
sed
Script mem-parsing file baris masukan demi baris, dan ketika garis sesuai dengan polaSomeTestAA
, duased
perintah editingN
dand
dieksekusi. TheN
perintah menambahkan baris berikutnya dari input ke ruang pola (buffer yangsed
dapat mengedit), dand
menghapus ruang pola dan mulai siklus berikutnya.sumber
Sudah mencoba dengan perintah sed di bawah ini dan itu bekerja dengan baik
perintah
keluaran
sumber
Anda dapat menggunakan GNU
sed
'sd
perintah untuk menghapus garis, dan awalan dengan/pat/,+N
untuk memilih baris yang cocok dengan pola dan selanjutnya N baris. Dalam kasus Anda, N = 1 karena Anda hanya ingin menghapus satu baris berikutnya setelah satu baris yang cocok:sumber