Jak używać grep dla 2 różnych linii


15

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:


20

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)
  • -o wydrukuj tylko dopasowaną część

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
Jason Pyeron

6

Lubię to:

grep "sweet\|lemon"

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?
Henning Kockerbeck,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.