na przykład mam duży plik tekstowy z wieloma adresami e-mail, używając bash potrzebuję wyszukać / zweryfikować, czy wiadomość e-mail istnieje (lub nie). Czy należy używać (tylko) „kotwic”?
grep '^[email protected]' text_file
czy są lepsze sposoby? Potrzebuję stworzyć skrypt bash i chciałbym być bezpieczny.
grep -q '^user1@example\.com\>'
- z kotwicą linii na początku i kotwicą końca słowa na końcu.Odpowiedzi:
Zobacz opcje
-F
(stały ciąg, w przeciwieństwie do wyrażeń regularnych) i-x
(dokładnie: dopasuj całą linię).byłoby równoważne z:
(pamiętaj, że
.
jest to operator wyrażeń regularnych, który pasuje do dowolnego znaku).Użyj tej
-q
opcji, jeśli chcesz tylko sprawdzić, czy jest taka linia:Jeśli wiersz do wyszukania i nazwa pliku są zmienne:
Lub
Nie chcesz:
grep -Fxq "$email" "$file"jako że mogłoby spowodować problemy, jeśli
$email
lub$file
zaczęło się-
.Jeśli plik jest posortowany (najlepiej w bieżącej lokalizacji
C
), możesz przyspieszyć, używająccomm
zamiastgrep
:Przewaga stanie się bardziej oczywista, gdy będziesz mieć kilka adresów e-mail do sprawdzenia (na przykład w innym posortowanym pliku):
byłoby szybsze niż:
źródło
grep -Fxq -- "$email" "$file"
również działa.<
readresatora? czy są jakieś zalety?-
. nawetgrep -- "$email" "$file"
byłby problem dla pliku o nazwie-
(którygrep
traktuje specjalnie jako oznaczający stdin )Aby być maksymalnie wydajnym, chcesz zatrzymać się po znalezieniu pierwszego meczu. Jeśli masz GNU
grep
, możesz to zrobić:Jeśli nie, możesz użyć Perla:
źródło
-m
jest specyficzny dla GNU. Użyj POSIX,-q
jeśli chcesz sprawnie sprawdzić, czy istnieje taka linia.Jest tam wiele czeków e-mailowych. Jednym z nich jest:
Opracować moją odpowiedź.
Używasz
^
kotwicy, która wskazuje początek łańcucha. To nie pasuje, jeśli adres e-mail znajduje się gdzieś pomiędzy długim ciągiem.źródło
Twoje
grep
polecenie dopasuje wszystko, co zaczyna się od^[email protected]
, w tym sam adres e-mail, ale także[email protected]
. ponieważ.
jest to znak specjalny w wyrażeniach regularnych pasujący do dowolnego klawisza, powinieneś uciec przed nim jako\.
zakładając, że plik tekstowy zawiera jeden adres w wierszu, użyj:
trailing
$
sprawi, że linia skończy się po adresie e-mail. Używam również podwójnych cudzysłowów"
, ponieważ pozwalają one na używanie zmiennych (w przeciwieństwie do pojedynczych cudzysłowów'
)źródło
user1@example-com
.-Fx
.-Fx
ale taka jest odpowiedźBiorąc pod uwagę ogólne dopasowanie literału / łańcucha ścisłego:
lub,
źródło