Jak używać grep do samodzielnego wyszukiwania wyrażeń regularnych bez ich analizowania

2
grep . filename.txt 

To po prostu zwraca całą zawartość pliku.txt, ponieważ. jest wyrażeniem regularnym, które oznacza dowolny znak. Jak używać grep do wyszukiwania okresów lub innych wyrażeń regularnych, takich jak *?

MYV
źródło
2
Czy próbowałeś ich uciec, jak w lub
Karan
Nie działa Radzenie sobie ze znakami ucieczki to coś, co powłoka robi dla ciebie, a nie same programy. Grep wyłącza większość przetwarzania wstępnego powłoki na wejściach, przynajmniej w ubuntu.
MYV
1
@Maksim Twoja powłoka traktuje zawartość w cudzysłowach jako literały. Oznacza to, że grep polecenie zostało faktycznie przekazane \. jako parametr, który może następnie interpretować jako dosłowny .. Jeśli nie masz \ , następnie grep po prostu dostaje . jako parametr, który pasuje do dowolnego znaku. Jeśli nie masz cytatów, Twoja powłoka przetworzy \ , i znowu grep po prostu dostanie . jako parametr.
Darth Android
1
@Maksim Dokładnie! To zachowanie jest udokumentowane w podręcznikach dla grep i powłoki, dlatego ludzie trochę tracili z „braku badań”.
Darth Android
2
Pytanie, jak się obecnie stwierdza (i odpowiada), ma sens. Jak wyszukać literał łańcuchowy reprezentujący wyrażenie regularne jest bardzo ważnym pytaniem. Wszyscy muszą się uspokoić.
Der Hochstapler

Odpowiedzi:

10

grep domyślnie używa wyrażeń regularnych, dowolny wzorzec podany grep przyjmuje się, że jest wyrażeniem regularnym, chyba że używasz -F przełącznik.

Wyrażenia takie jak *? nie są częścią Wyrażenie regularne POSIX język, który jest czym grep używa domyślnie. Możesz użyć takich konstrukcji, podając inny język wyrażeń regularnych, na przykład Perl:

$ cat a.txt
aaaaaaaa
aabbccaaaacccccccccb
bbbbbb
$ grep -oP 'a.*?b' a.txt
aab
aaaacccccccccb

Aby wyszukać wiersz zawierający co najmniej jeden okres, użyj

$ grep '\.*' foo.txt

Dla wiersza zawierającego tylko okresy użyj

$ grep '^\.*$' foo.txt

Dla bardziej złożonych wyrażeń regularnych użyj -F:

$ grep -F '[a-z]*.*[AHG].*' foo.txt
[a-z]*.*[AHG].*
terdon
źródło
Twoje ostatnie wyrażenie pasuje do linii zawierających tylko okresy I puste linie.
tink
5

Posługiwać się fgrep zamiast tego, jeśli chcesz szukać literałów, nie wyrażeń regularnych.

Jeśli chcesz po prostu wyłączyć specjalne znaczenie jednego z znaków regularnych za pomocą grep, po prostu uciekaj za pomocą odwrotnego ukośnika, zwracając uwagę, że jeśli wpisujesz to w wierszu poleceń, być może będziesz musiał „wymknąć się ucieczkom”, ponieważ twoja powłoka może usunąć jedną warstwę z nich przed przekazaniem ich dziecku.

Nicole Hamilton
źródło
Co jeśli chcę mieszać i dopasowywać, np. szukać linii okresów za pomocą. *?
MYV
4

grep -F nie rozszerzy wyrażeń regularnych. człowiek grep:

-F, --fixed-strings                 Interpretuj PATTERN jako listę stałych ciągów znaków, oddzielonych znakami nowej linii.

Proszę zauważyć F i nie f!

Chris
źródło
Co jeśli chcę mieszać i dopasowywać
MYV