Próbowałem znaleźć sposób na odfiltrowanie wiersza zawierającego słowa „cytryna” i „ryż”. Wiem, jak znaleźć „cytrynę” lub „ryż”, ale nie dwa z nich. Nie muszą znajdować się obok siebie, tylko jeden wiersz tekstu.
text-processing
grep
Sebastian
źródło
źródło
Odpowiedzi:
„Oba w tej samej linii” oznaczają „ryż”, po których następują losowe znaki, po których następuje „cytryna” lub odwrotnie.
W wyrażeniu regularnym czyli
rice.*lemon
lublemon.*rice
. Możesz to połączyć za pomocą|
:Jeśli chcesz użyć normalnego wyrażenia regularnego zamiast rozszerzonych (
-E
), potrzebujesz odwrotnego ukośnika przed|
:Aby uzyskać więcej słów, które szybko stają się nieco dłuższe i zwykle łatwiej jest używać wielu wywołań
grep
, na przykład:źródło
grep rice
znajduje wiersze zawierającerice
. Jest karmiony, wgrep lemon
którym znajdą się tylko linie zawierające cytrynę ... i tak dalej. Podczas gdy PO - podobnie jak poprzednie odpowiedzi - zezwala na każdy z [ryż | cytryna | kurczak]|
trzeba uciekaćgrep
? Dzięki!egrep
używa rozszerzonego wyrażenia regularnego, gdzie|
jest rozumiane jako logika OR.grep
domyślnie jest wyrażeniem regularnym, gdzie\|
ORgrep
podręcznika,egrep
jest przestarzałe i powinno zostać zastąpione przezgrep -E
. Pozwoliłem sobie odpowiednio edytować odpowiedź.Możesz przesłać dane wyjściowe pierwszego polecenia grep do innego polecenia grep, które pasowałoby do obu wzorców. Możesz więc zrobić coś takiego:
lub,
Przykład:
Dodajmy trochę zawartości do naszego pliku:
Co zawiera plik:
Teraz grep, co chcemy:
Otrzymujemy tylko linie, w których oba wzorce pasują. Możesz to rozszerzyć i przesłać dane wyjściowe do innego polecenia grep w celu uzyskania dalszych dopasowań „AND”.
źródło
Chociaż pytanie dotyczy „grep”, pomyślałem, że pomocne może być opublikowanie prostego rozwiązania „awk”:
Można to łatwo rozszerzyć o więcej słów lub innych wyrażeń logicznych oprócz „i”.
źródło
Innym pomysłem na znalezienie dopasowań w dowolnej kolejności jest użycie:
grep z opcją
-P
(Perl-Compatibility) i regex pozytywnego wyglądu(?=(regex))
:lub możesz użyć poniżej:
.*?
środki dopasowania żadnych znaków.
, że zdarzenia zero lub więcej razy*
, gdy są opcjonalne, a następnie wzór (rice
lublemon
).?
Czyni wszystko Opcjonalnie przed (czyli zero lub jeden raz wszystkiego dopasowane.*
)(?=pattern)
: Positive Lookahead: Pozytywna konstrukcja lookahead to para nawiasów, z nawiasem otwierającym, po którym następuje znak zapytania i znak równości.To zwróci wszystkie wiersze z zawiera oba
lemon
irice
w losowej kolejności. Pozwoli to również uniknąć używania|
s i podwójnychgrep
s.Linki zewnętrzne: Zaawansowane tematy Grep Pozytywne spojrzenie w przyszłość - GREP dla projektantów
źródło
Zwróci mecze dla foo lub goo
źródło
Jeśli przyznamy, że udzielenie odpowiedzi, która nie jest
grep
oparta, jest akceptowalne, podobnie jak powyższa odpowiedź oparta naawk
, zaproponowałbym prostąperl
linię, taką jak:Wyszukiwanie może ignorować wielkość liter w przypadku niektórych / wszystkich słów takich jak
/lemon/i and /rice/i
. Na większości maszyn Unix / Linux perl jest instalowany, a także awk.źródło
Oto skrypt automatyzujący rozwiązanie grep piping:
źródło
eval
go, co łatwo się