Jak wyszukać dwie różne frazy, gdy są w dwóch różnych wierszach, za pomocą jednego grep
polecenia?
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 grep
polecenia?
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ć grep
dwó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ż grep
uważ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 -P
pomocą przycisku \n
dopasowania 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.
-E
Uż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-P
Używaj wyrażeń regularnych w stylu perla („eksperymentalne” w grep
- zainstaluj pcregrep
zamiast tego, aby uzyskać lepszą obsługę wyrażeń regularnych w perlu)-z
Użyj znaku null jako separatora (w tym przypadku udawaj, ale grep
uwierzemy 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"
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?
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
.