Jak mogę wybrać pierwsze wystąpienie między dwoma wzorami, w tym nimi. Najlepiej używając sed
lub awk
.
Mam:
text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text
Chcę pierwszego wystąpienia linii między P1 i P2 (w tym linii P1 i linii P2):
something P1 something
content1
content2
something P2 something
sed
awk
regular-expression
kofucii
źródło
źródło
sed
... to jest błąd w twoimsed
uruchomieniu, a nie w powyższym skrypcie./P2/q
w moim systemie, jak i bez niego ; to jest to. Byłem ciekawy czegoś i chciałem podzielić się tym, co znalazłem.z
awk
źródło
W
sed
:-n
pomija drukowanie domyślne i drukujesz linie między pasującymi zakresami adresów za pomocąp
polecenia.q
), gdy pierwszyP2
pasuje.To się nie powiedzie, jeśli
P2
przyjdzie wcześniejP1
. Aby poradzić sobie z tą sprawą, spróbuj:źródło
Jeśli chcesz pominąć same wzorce, oto
awk
wersja:źródło
Prostsze
awk
rozwiązanie (w połowie drogi między odpowiedzią iruvara a odpowiedzią Muru , ale bez użycia zmiennej):i, jak zauważył muru, jeśli pierwsze P2 pojawi się przed pierwszym P1, to nic nie wydrukuje.
Oczywiście, jeśli chcesz wydrukować wszystkie zakresy P1-P2:
po prostu pomiń
exit
część:źródło
Wyjdź natychmiast po wydrukowaniu, nie wcześniej.
źródło
Aby pominąć same wzorce i wyświetlić tylko pierwszy pasujący blok w pojedynczym GNU sed:
źródło