Jak dołączyć znak spacji do grep?

17

Mam plik o nazwie przykład

$ cat example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

a kiedy używam, grepaby uzyskać linię, która ma wcześniej spację .pdf, nie mogę jej uzyskać.

grep *.pdf example

nic nie zwraca (chcę powiedzieć „grep, dopasuj zero lub więcej spacji przed .pdf”, ale nie ma rezultatu)

a jeśli użyję:

grep i*.pdf example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

wszystkie linie wracają, ponieważ mówię „grep, dopasuj mnie ijeden lub zero razy, ok.”

i na koniec:

grep " *.pdf" example

nie zwraca wyników

Dla tej próbki chcę zobaczyć

grep .pdf 

jako wynik

Co jest nie tak z moją myślą?

solfish
źródło

Odpowiedzi:

31

Pamiętaj o zacytowaniu wyrażenia. Myślę, że dzielenie słów na powłoki jest jednym z twoich problemów tutaj, ale zawsze powinieneś cytować swoje wyrażenie regularne, ponieważ w przeciwnym razie wszystko pójdzie źle.

$ grep ' \.pdf' example
grep .pdf

Lub jeśli może być wiele spacji (nie możemy użyć, *ponieważ będzie to pasować do przypadków, w których nie ma poprzedzających spacji)

grep ' \+\.pdf' example

+oznacza „jeden lub więcej poprzedzających znaków”. W BRE musisz uciec przed nią, \aby uzyskać tę specjalną funkcję, ale zamiast tego możesz użyć ERE, aby tego uniknąć

grep -E ' +\.pdf' example 

Możesz także użyć \sw grepcelu oznaczenia spacji

grep '\s\+\.pdf' example

Powinniśmy uciec dosłownie, .ponieważ w wyrażeniu regularnym .oznacza dowolną postać, chyba że należy do klasy postaci.

Zanna
źródło
Jako pierwszy zauważyłeś, że w ostatnim wierszu jest miejsce.
Pilot6
@ Pilot6 dzięki. Pytanie było trochę myląco napisane :)
Zanna
Dla pierwszego, który zrozumiał pytanie, powinna być jakaś odznaka ;-)
Pilot6
@Zanna, czy w tych przypadkach jest coś złego do zrobienia w dowolnym momencie? egrep zawsze daje ci przewagę ...
solfish
@solfish egrepjest (pod względem stylu wyrażenia regularnego, afaik) taki sam grep -E, i uważam, że powinniśmy używać tego drugiego - egrepitp. podobno są przestarzałe na rzecz grepflag
Zanna