Grep batas kata


22

Dokumentasi Accor untuk GNU:

‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.

/ Etc / fstab saya terlihat seperti ini:

/dev/sdb1       /media/fresh      ext2   defaults     0 0

Saya ingin grep mengembalikan TRUE / FALSE untuk keberadaan / media / fresh. Saya mencoba menggunakan \<dan \>tetapi tidak berhasil. Mengapa?

egrep '\</media/fresh\>' /etc/fstab

Penanganan masalah:

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab

Tapi itu terlihat lebih jelek.

Grep saya 2.5.1


4
Saya kira /tidak dianggap sebagai karakter kata, jadi regex tidak akan cocok - "\ b cocok sebelum dan setelah urutan alfanumerik" lebih tepat daripada mengatakan "sebelum dan sesudah kata"
Felipe Alvarez

Jawaban:


27

\<dan \>mencocokkan string kosong di awal dan akhir kata masing-masing dan hanya karakter penyusun kata yang:

[[:alnum:]_]

Dari man grep:

Word-constituent characters are letters, digits, and the underscore.

Jadi, Regex Anda gagal karena /bukan karakter konstituen kata yang valid.

Alih-alih karena Anda memiliki ruang di sekitar, Anda dapat menggunakan -wopsi grepuntuk mencocokkan kata:

grep -wo '/media/fresh' /etc/fstab

Contoh:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh

Saya mencari sebanyak setelah saya memposting Pertanyaan saya. Ada saran untuk apa yang ingin saya capai?
Felipe Alvarez

@FelipeAlvarez Periksa hasil edit saya ..
heemayl

1

Masalah dengan \<(dan juga \b) ini berlaku tidak hanya untuk /, tetapi untuk semua karakter non-kata. (yaitu karakter selain [[:alnum:]]dan _.)

Masalahnya adalah bahwa mesin regex akan selalu memotong karakter non-kata seperti /saat mencari jangkar berikutnya \<. Itu sebabnya Anda tidak harus menempatkan karakter non-kata seperti /setelahnya \<. Jika Anda melakukannya, dengan konstruksi, tidak ada yang cocok.

Alternatif untuk -wopsi grep, akan menjadi sesuatu seperti ini:

egrep "(^|\W)/media/fresh($|\W)"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.