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.
Uwagi:
-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)
Chociaż 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.
Marc van Leeuwen,
tak, jest to przydatne tylko z -o... edytowanym ...
Zanna
Jeśli zostanie to wypróbowane na innych dystrybucjach, możesz napotkać: grep: The -P and -z options cannot be combined- np. Grep (GNU grep) 2.5.1 na RHEL
przepraszam, ale to pasuje dokładnie do „słodkiej | cytryny”
αғsнιη
4
@KasiyA Ta linia działa dobrze. 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 -zP
polecenie 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
.-o
... edytowanym ...grep: The -P and -z options cannot be combined
- np. Grep (GNU grep) 2.5.1 na RHELLubię to:
źródło
grep
domyś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?