Wiem, że za pomocą "-A NUM"
przełącznika mogę wydrukować określoną liczbę linii końcowych po każdym dopasowaniu. Zastanawiam się tylko, czy można wydrukować końcowe wiersze, dopóki po każdym dopasowaniu nie zostanie znalezione określone słowo. np. kiedy szukam „Słowa A”, chcę zobaczyć wiersz zawierający „Słowo A”, a także wiersze po nim, aż do wiersza zawierającego „Słowo D”.
kontekst:
Word A
Word B
Word C
Word D
Word E
Word F
Komenda:
grep -A10 'Word A'
Potrzebuję tego wyjścia:
Word A
Word B
Word C
Word D
| sed -e '1d;$d'
, że usuwa pierwszą i ostatnią linięsed -n -e '/pattern A/,/pattern D/d; p'
To mówi: „usuń ze wzoru A do wzoru D i wydrukuj wszystko inne”. Niestety ten mecz jest chciwy. Oznacza to, że jeśli wzory A i D pojawią się więcej niż jeden raz, dopasujesz od pierwszego wzoru A do ostatniego wzoru D. Obawiam się, że Perl lub Python są twoimi przyjaciółmi, jeśli tak jest.dlaczego nie użyć awk?
źródło
Word D
spada na tę samą linię coWord A
i być może gdzie indziej, np.Word A Word D\nWord D
z sed pokaże dwie linie, gdzie jako awk pokaże jedną. Dodatkowo nadal można używać zmiennych z awk, np.awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file"
Więc sed może być bardziej wydajny, ale w przypadku wyszukiwania dwóch ciągów znaków, które mogą, ale nie muszą spaść w tej samej linii, awk jest zdecydowanie bardziej niezawodny.A
iB
i chcesz tylko uchwycić to, co znajduje się pomiędzy każdej takiej sekwencji. wygląda na to, że sed przynajmniej nie stosuje się do tej semantyki.lub
źródło
sed
, chyba że potrzebujesz mocy wyrażeń regularnych Perla, aby wybrać linie rozdzielające.