Jestem nowy w pisaniu skryptów i starałem się nauczyć, jak wyodrębnić dowolny tekst, który istnieje pomiędzy dwoma różnymi wzorami. Jestem jednak nadal nie jest w stanie zorientować się, jak wydobyć tekst pomiędzy dwoma wzorami w następującym scenariuszu:sed/awk - drukowanie tekstu między wzorami rozpiętymi w wielu liniach
Jeśli mam mój plik wejście przeczytać:
Hi I would like
to print text
between these
patterns
i mój oczekiwany wyjście jest jak:
I would like
to print text
between these
czyli mojego pierwszego wyszukiwania wzór „Hi” i pominąć ten wzór, ale wydrukować wszystko, co istnieje w tej samej linii poniższy wzór dopasowane mój drugi searc. Wzór h to "wzory" i chciałbym całkowicie uniknąć drukowania tej linii lub jakichkolwiek linii poza nią.
Próbowałem następujące:
sed -n '/Hi/,/patterns/p' test.txt
[Wyjście]
Hi I would like
to print text
between these
patterns
Następnie próbowałem:
`awk ' /'"Hi"'/ {flag=1;next} /'"pattern"'/{flag=0} flag { print }'` test.txt
[Wyjście]
to print text
between these
Czy ktoś może mi pomóc w określeniu, jak to osiągnąć? góry dzięki
Wielkie dzięki za odpowiedź i szczegółowy opis paxdiablo, twój soln. działa jak marzenie :-). W moim przypadku nie powtarzam powtarzających się słów wzorców wzdłuż tej samej linii ani żadnych słów występujących przed "wzorami". W moim scenariuszu zawsze mogę zidentyfikować początek linii, od której chciałbym odrzucić wszystko, a ta linia zawsze zaczyna się od tego samego wzorca. Jeszcze raz dziękuję za odpowiedź, bardzo doceniane :-) –
Kilka problemów: 1) "^. * Cześć" to to samo co "Cześć" w RE, 2) Nie musisz podawać 0 jako trzeciego argumentu dla * sub(), 3) Nie potrzebujesz gsub(), gdy chcesz zastąpić tylko 1 wystąpienie, i 4) "{if (echo == 1) {print}}" jest równoważne tylko "echo" na jego. –
Ed. Re 1, nie, nie jest, a nie kiedy zastępujesz - różnica między subboksem a cześć lub wszystko na linii aż do cześć. Inne punkty są ważne, ale w większości stylistyczne. – paxdiablo