Греп межі слова


22

Приєднання до документації GNU:

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

Мій / etc / fstab виглядає так:

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

Я хочу, щоб греп повернув ІСТИЧНУ / ФАЛЬСУ за існування / медіа / свіжий. Я намагався використовувати \<і \>але це не спрацювало. Чому?

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

Обхід:

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

Але це виглядає потворніше.

Мій греп - 2.5.1


4
Я вважаю /, що не вважається символом слова, тому регулярний вираз не збігається - "\ b збігається перед і після буквено-цифрової послідовності" є більш точним, ніж вимова "до і після слова"
Феліпе Альварес

Відповіді:


27

\<і \>відповідають порожньому рядку на початку та в кінці слова відповідно, і лише символами, що входять до слова, є:

[[:alnum:]_]

Від man grep:

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

Отже, ваш Regex виходить з ладу, оскільки /не є коректним словником символу.

Замість того, як у вас є пробіли навколо, ви можете скористатися -wопцією grepвідповідності слову:

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

Приклад:

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

Я рахую стільки ж, як я опублікував своє запитання. Якась пропозиція щодо того, чого я хочу досягти?
Феліпе Альварес

@FelipeAlvarez Перевір мої зміни ..
heemayl

1

Ця проблема з \<(і також \b) стосується не лише /символів, які не мають слова. (тобто символи, відмінні від [[:alnum:]]та _.)

Проблема полягає в тому, що двигун регулярного вираження завжди обійде несловесний символ, як, наприклад, /під час пошуку наступного якіря \<. Ось чому не слід ставити неслівні символи, як /відразу після \<. Якщо ви робите, за будівництвом нічого не відповідатиме.

Альтернативою -wваріанту grep буде щось подібне:

egrep "(^|\W)/media/fresh($|\W)"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.