Her grep eşleşmesinden sonra diğer belirli eşleşmeye kadar satırlar nasıl gösterilir?


44

"-A NUM"Düğmeyi kullanarak, her maçtan sonra belirli sayıda son çizgileri yazdırabileceğimi biliyorum . Her maçtan sonra belirli bir kelime bulunana kadar takip satırları yazdırmanın mümkün olup olmadığını merak ediyorum. Örn: "A Word" kelimesini ararken, "A Word" içeren satırı ve ondan sonra da "Word D" içeren satır olanını görmek istiyorum.

bağlam:

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

komut:

grep -A10 'Word A'

Bu çıktıya ihtiyacım var:

Word A
Word B
Word C
Word D

Yanıtlar:


73

' Word A' Ve ' Word D' (dahil) arasında satırlar yazdırmak istediğiniz anlaşılıyor . Ben Kullanmak önermek sedyerine grep. İstediğiniz modellerle başlayan ve biten bir girdi akışı aralığını düzenlemenizi sağlar. Sadece sedaralıktaki tüm satırları yazdırmanızı ve başka satırları yazdırmamasını söylemelisiniz :

sed -n -e '/Word A/,/Word D/ p' file

Özel hale getirme konusunda herhangi bir ipucu (sadece OP'ler için değil, genel bir durum için)?
02'de

4
@ 2rs2ts'yi özel yapmak için, sadece ekleyin | sed -e '1d;$d', bu ilk ve son satırı kaldırın
holroy

Ve aralarındaki tüm çizgileri hariç tutmak istiyorsanız - yani, sadece iki eşleşmenin dışındaki çizgileri görmek istiyorsunuz - o zaman sed -n -e '/pattern A/,/pattern D/d; p'şöyle der : "A biçiminden D biçimini silin ve her şeyi yazdırın". Ne yazık ki, bu maç açgözlü. Bu, eğer A ve D kalıpları bir kereden fazla ortaya çıkarsa, ilk kalıp A'dan son kalıp D'ye eşleşeceksiniz demektir. Korkarım Perl veya Python bu durumda arkadaşlarınızdır.
19'da fbicknel

16

neden awk kullanmıyorsun?

awk '/Word A/,/Word D/' filename

2
Çok sayıda dosya varsa, sed bunu daha verimli bir şekilde yapabilir. awk hatırlamak daha kolay olabilir, ama sed beynimdeki yapışkan nota değiyor gibi görünüyor.
JimNim

1
awk, Word Daynı satırda Word Ave muhtemelen başka bir yere düşerse , örneğin Word A Word D\nWord Dsed ile birlikte, awk'nin bir satır göstereceği iki satırı gösterir. Ek olarak, biri hala awk değişkenlerini kullanabilir, örneğin awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file", belki daha verimli, ancak aynı satırda düşebilecek veya düşmeyecek iki dizginin aranmasıyla ilgilenirken, awk kesinlikle daha güvenilir olur.
S0AndS0

o awk iyi görünüyor dosya dizilerini içerdiği durumda işler Ave Bve sadece her tür sekans arasında ne yakalamak istiyorum. en azından benim durumumda sed bu anlambilimi izlemiyor gibi görünüyor.
Matan

9
perl -lne 'print if /Word A/ .. /Word D/' file

veya

cat file | perl -lne 'print if /Word A/ .. /Word D/'

1
Sürüşte aşağı oy vermek için +1 tuşuna basın. sedSınırlayıcı çizgileri seçmek için Perl düzenli ifadelerinin gücüne ihtiyaç duymazsanız, yine de bunu kullanırdım .
üçlü

70'lerde sed yazan insanlar şükretmeli olmalı :-)
Matan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.