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
| sed -e '1d;$d'
, yaitu menghapus baris pertama dan terakhirsed -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.mengapa tidak menggunakan awk?
sumber
Word D
jatuh pada garis yang sama denganWord A
, dan mungkin di tempat lain, misalnyaWord A Word D\nWord D
dengan sed akan menunjukkan dua baris di mana sebagai awk akan menunjukkan satu. Selain itu kita masih dapat menggunakan variabel dengan awk, misalnyaawk -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.A
danB
dan Anda hanya ingin menangkap apa di antara setiap urutan tersebut. sepertinya sed tidak mengikuti semantik ini dalam kasus saya setidaknya.atau
sumber
sed
ini, kecuali jika Anda memerlukan kekuatan ekspresi reguler Perl untuk memilih garis pembatas.