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ą?

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.


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
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.