Bagaimana cara menunjukkan garis setelah setiap pertandingan grep hingga pertandingan tertentu lainnya?

45

Saya tahu bahwa dengan menggunakan "-A NUM"saklar saya bisa mencetak jumlah tertentu baris tertinggal setelah setiap pertandingan. Saya hanya ingin tahu apakah mungkin untuk mencetak garis tertinggal sampai kata tertentu ditemukan setelah setiap pertandingan. misal ketika saya mencari "Word A" saya ingin melihat baris yang berisi "Word A" dan juga baris setelahnya sampai yang berisi "Word D".

konteks:

Word A
Word B
Word C
Word D
Word E
Word F

perintah:

grep -A10 'Word A'

Saya butuh hasil ini:

Word A
Word B
Word C
Word D
Meysam
sumber

Jawaban:

74

Tampaknya Anda ingin mencetak garis antara ' Word A' dan ' Word D' (inklusif). Saya sarankan Anda untuk menggunakan sedbukan grep. Ini memungkinkan Anda untuk mengedit berbagai aliran input yang dimulai dan diakhiri dengan pola yang Anda inginkan. Anda hanya harus memberitahu seduntuk mencetak semua garis dalam jangkauan dan tidak ada garis lain:

sed -n -e '/Word A/,/Word D/ p' file
Saeedn
sumber
Adakah tips tentang cara menjadikannya eksklusif (untuk situasi umum apa pun, bukan hanya OP)?
2rs2ts
4
@ 2rs2ts untuk membuatnya eksklusif, tambahkan saja | sed -e '1d;$d', yaitu menghapus baris pertama dan terakhir
holroy
Dan jika Anda ingin mengecualikan semua garis di antara - yaitu, Anda hanya ingin melihat garis yang berada di luar dua pertandingan - maka: sed -n -e '/pattern A/,/pattern D/d; p'Ini mengatakan, "hapus dari pola A ke pola D dan cetak semua yang lain". Sayangnya, pertandingan ini serakah. Itu berarti jika pola A dan D muncul lebih dari satu kali, Anda akan mencocokkan dari pola pertama A ke pola terakhir D. Saya khawatir Perl atau Python adalah teman Anda jika itu masalahnya.
fbicknel
16

mengapa tidak menggunakan awk?

awk '/Word A/,/Word D/' filename
cesar
sumber
2
Sed tampaknya dapat melakukan ini jauh lebih efisien jika sejumlah besar file terlibat. awk mungkin lebih mudah diingat, tetapi sed tampaknya bernilai catatan tempel di otak saya.
JimNim
1
awk lebih unggul jika Word Djatuh pada garis yang sama dengan Word A, dan mungkin di tempat lain, misalnya Word A Word D\nWord Ddengan sed akan menunjukkan dua baris di mana sebagai awk akan menunjukkan satu. Selain itu kita masih dapat menggunakan variabel dengan awk, misalnya awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file", jadi mungkin lebih efisien tetapi ketika berhadapan dengan pencarian dua string yang mungkin atau mungkin-tidak jatuh pada baris yang sama, awk pasti lebih dapat diandalkan.
S0AndS0
tampaknya awk lebih baik menangani case bahwa file berisi urutan Adan Bdan Anda hanya ingin menangkap apa di antara setiap urutan tersebut. sepertinya sed tidak mengikuti semantik ini dalam kasus saya setidaknya.
Matan
9
perl -lne 'print if /Word A/ .. /Word D/' file

atau

cat file | perl -lne 'print if /Word A/ .. /Word D/'
vinian
sumber
1
+1 untuk melawan downvote drive-by. Saya masih akan menggunakan sedini, kecuali jika Anda memerlukan kekuatan ekspresi reguler Perl untuk memilih garis pembatas.
tripleee
Orang yang menulis sed di tahun 70-an harus bersyukur :-)
Matan