Grep границы слова


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

Я хочу, чтобы grep возвращал TRUE / FALSE для существования / media / fresh. Я пытался использовать \<и \>но это не сработало. Зачем?

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

Временное решение:

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

Но это выглядит ужаснее.

Мой grep 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.