To pytanie ma już tutaj odpowiedzi :
Komentarze
Odpowiedź
grep
won ” W tym pomogę. To zadanie lepiej wykonać, używając sed
wyrażeń zakresu:
$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke
sed -n
wyłącza automatyczne drukowanie, więc wiersze są drukowane tylko wtedy, gdy zostanie o to wyraźnie poproszony. Dzieje się tak, gdy wystąpi zakres /aaa/,/cdn/
.
Te wyrażenia zakresu są również dostępne w awk
, gdzie możesz powiedzieć:
awk "/zdk/,/dke/" file
Oczywiście wszystkie te warunki można rozszerzyć do bardziej ścisłego wyrażenia regularnego, takiego jak sed -n "/^aaa$/,/^cdn$/p" file
, aby sprawdzić, czy wiersze składają się dokładnie z aaa
i cdn
, nic więcej.
Komentarze
- Wow, miałem ten sam problem i nie ' nie pytałem. Użyłem 2 wystąpień
grep -n
i porównałem liczbę dla mojego rozwiązania.
- Wyrażenia zakresu @KipK są bardzo przydatnym narzędziem w przypadku tego rodzaju problemów 🙂 Możesz użyj także
awk
i niektórych flag, ale podstawowy przypadek jest z tym dość prosty.
- @Fedorqui, mam problem, jeśli wzorzec wyszukiwania zawiera xml. na przykład muszę szukać zaczynając od < ns0: abcd xmlns = " " >, pobieranie resull. Ale pokazuje < abcd xmlns = " " > również. Próbowałem sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p plik
- @MukulAnand podaj przykład, abyśmy mogli sprawdzić krzyżowo.
- Jakikolwiek sposób nie wydrukować sam wzorzec początkowy i końcowy (z wyjątkiem używania początku i końca)?
Odpowiedź
Może należy wykonać przez sed
sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file
Odpowiedź
Oto grep
polecenie:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n"
Możesz uzyskać dopasowanie wielowierszowe w grep
, ale musisz użyć perl-regexp dla grep
(-P
– co nie jest obsługiwane na każdej platformie , jak OS X), aby obejść ten problem, zastępujemy nowe wiersze znakiem _
i po grep
, zmieniamy je z powrotem.
Alternatywnie możesz użyć pcregrep
, który obsługuje wzorce wieloliniowe (-M
).
Lub użyj ex
:
ex +"/aaa/,/cdn/p" -scq! file