Jak wyszukać dwie różne frazy, gdy są w dwóch różnych wierszach, za pomocą jednego greppolecenia?
Na przykład
Linia 1: To jest słodkie.
Wiersz 2: cytryna.
Użyłem tego, ale bez rezultatu
grep "sweet.*lemon" file_type
Jak wyszukać dwie różne frazy, gdy są w dwóch różnych wierszach, za pomocą jednego greppolecenia?
Na przykład
Linia 1: To jest słodkie.
Wiersz 2: cytryna.
Użyłem tego, ale bez rezultatu
grep "sweet.*lemon" file_type
Odpowiedzi:
Aby użyć grepdwóch różnych linii, wyszukaj oba wzorce
$ grep -e sweet -e lemon file_type
This is a sweet
lemon.
Lub użyj naprzemiennie
$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.
Aby uzyskać następny wiersz po wzorcu, możesz użyć opcji kontekstu
$ grep -A1 sweet file_type
This is a sweet
lemon.
Ale jeśli szukasz wyraźnie na multilinii wzór, który jest trudne, ponieważ grepuważa, że w linii ... . Twój .*złapie wszystko pomiędzy „słodki” i „Lemon” na linii . Możemy uzyskać „cytrynę” w następnym wierszu za -Ppomocą przycisku \ndopasowania do nowej linii i informując, grepże plik jest null oddzielony -z:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
-EUżywaj rozszerzonych wyrażeń regularnych (aby używać |znaku na przemian bez konieczności ucieczki)-An Wydrukuj dodatkowe linie po wzorze, gdzie n jest liczbą końcowych linii do wydrukowania-PUżywaj wyrażeń regularnych w stylu perla („eksperymentalne” w grep- zainstaluj pcregrepzamiast tego, aby uzyskać lepszą obsługę wyrażeń regularnych w perlu)-zUżyj znaku null jako separatora (w tym przypadku udawaj, ale grepuwierzemy na to)-o wydrukuj tylko dopasowaną część-o... edytowanym ...
grep: The -P and -z options cannot be combined- np. Grep (GNU grep) 2.5.1 na RHEL
Lubię to:
grep "sweet\|lemon"
grepdomyślnie prac w „trybie standardowym”, gdzie „Znaki specjalne” jak |, +, *są interpretowane dosłownie , chyba że są one zamaskowane z odwrotnym ukośnikiem. Zobacz na przykład tę odpowiedź . Aby użyć sposobu, w jaki prawdopodobnie jesteś przyzwyczajony, że „znaki specjalne” muszą być zamaskowane, aby mogły być interpretowane dosłownie, musisz przejść do „trybu rozszerzonego” ( grep -E). Może madneon może rozwinąć się nieco więcej na jego odpowiedzi, na przykład, co PO spróbować by zostały dopasowane?
grep -zPpolecenie zadziałałoby w tym konkretnym przypadku (plik składający się dokładnie z dwóch wierszy), ogólnie uznałby każdy zwykły plik rozdzielony znakiem nowej linii za jeden wiersz, więc albo zrzuć całą zawartość pliku (jeśli jest gdzieś dopasowanie) lub nic; zwykle nie do tego ludzie używajągrep.