Bagaimana cara memasukkan karakter spasi dengan grep?

17

Saya punya file bernama contoh

$ cat example

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

dan ketika saya gunakan grepuntuk mendapatkan garis yang memiliki ruang sebelumnya .pdf, saya sepertinya tidak bisa mendapatkannya.

grep *.pdf example

tidak menghasilkan apa-apa, (saya ingin mengatakan, "grep, cocokkan nol atau lebih banyak spasi sebelumnya .pdf", tetapi tidak ada hasil)

dan jika saya menggunakan:

grep i*.pdf example

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

semua baris kembali, karena saya katakan "grep, cocokkan saya isatu atau nol kali, ok."

dan terakhir:

grep " *.pdf" example

tidak ada hasil yang dikembalikan

Untuk sampel ini, saya ingin melihatnya

grep .pdf 

sebagai output

Apa yang salah dengan pikiran saya?

solfish
sumber

Jawaban:

31

Pastikan Anda mengutip ungkapan Anda. Saya pikir shell wordsplitting adalah salah satu masalah Anda di sini, tetapi Anda harus selalu mengutip regex Anda, karena semua hal akan menjadi salah.

$ grep ' \.pdf' example
grep .pdf

Atau jika mungkin ada beberapa spasi (kami tidak dapat menggunakan *karena ini akan cocok dengan kasus di mana tidak ada spasi sebelumnya)

grep ' \+\.pdf' example

+berarti "satu atau lebih dari karakter sebelumnya". Di BRE Anda harus menghindarinya \untuk mendapatkan fungsi khusus ini, tetapi Anda dapat menggunakan ERE sebagai gantinya untuk menghindari ini

grep -E ' +\.pdf' example 

Anda juga dapat menggunakan \sdalam grepberarti ruang

grep '\s\+\.pdf' example

Kita harus melarikan diri secara literal .karena dalam regex .berarti karakter apa pun, kecuali jika itu dalam kelas karakter.

Zanna
sumber
Anda adalah orang pertama yang memperhatikan bahwa baris terakhir memiliki ruang.
Pilot6
@ Pilot6 terima kasih. Pertanyaannya sedikit membingungkan :)
Zanna
Harus ada beberapa lencana untuk yang pertama yang mengerti pertanyaan ;-)
Pilot6
@Zanna, apakah ada yang salah untuk pergi kapan saja egrep dalam kasus ini? egrep selalu memberi Anda keuntungan ...
solfish
@solfish egrepadalah (dalam hal gaya regex, afaik) sama dengan grep -E, dan saya percaya kita seharusnya menggunakan yang terakhir - egrepdll seharusnya tidak digunakan lagi untuk grepbendera
Zanna