![Ссылка](https://rvso.com/image/52094/%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0.png)
На странице руководства grep
я вижу
The symbols \< and \> respectively match the empty string at the beginning and
end of a word. The symbol \b matches the empty string at the edge of a word.
Но я все еще не могу понять разницу. Для меня \b
это обозначение Perl для границы слова, а \<
это обозначение Vim для той же цели.
PS: Английский не мой родной язык. Извините, если разница для вас очевидна.
решение1
\<
соответствует началу слова
\>
соответствует концу слова
\b
соответствует обеим границам, если в конце или в начале
Важной особенностью этих специальных символов является то, что они соответствуют пустой строке, а не самой границе слова. Граница слова является противоположностью набора символов, представленного эквивалентом \w
( [_[:alnum:]]
буквы от a до Z, цифры и _
) в нотации Posix.
Пример
Окончательно,Грэм нашел очень интересный пример:
$ echo 'acegi z' | grep -o '[acegi ]*\>' | cat -A
acegi$
$ echo 'acegi z' | grep -o '[acegi ]*\b' | cat -A
acegi $
В настоящее время этот пример показывает, что иногда может быть полезно точно сопоставить конец слова вместо границы слова, поскольку использование соответствующего пробела избегается путем сопоставления конца слова.
Поэтому в более полезном примере я бы сказал, что если вы хотите сопоставить несловной символ и конец этого неслова, вы не можете использовать \>
; но, возможно, \b
можно использовать в этом конкретном случае, поскольку это будет соответствовать началу следующего слова.
Пока ни один пример не пришел мне в голову. Но, по-моему, есть несколько случаев использования, где это имеет смысл, но я предполагаю, что это только для удобства чтения, потому что когда вы вводите, \b
это неопределенно, но если вы точно указываете начало или конец слова, то это дает лучшее понимание регулярного выражения тем, кто его читает.
решение2
Чтобы ответить на вопрос в заголовке?
В чем разница между
\b
и\<
...
Почти нет. Оба соответствуютграница, переход между словом и не-словом.
Единственныйтехническийразница в следующем:
- Соответствие
\b
границе наобаначало и конец слова. - Единственное
\<
совпадениеначинатьслова. - Единственное
\>
совпадениеконецслова.
Theпрактичныйразница в следующем:
$ echo ',,abc...' | grep -o '[abc.,]*'
,,abc... # match the whole string
$ echo ',,abc...' | grep -o '[abc.,]*\b'
,,abc # to the rightmost (due to *) word boundary.
$ echo ',,abc...' | grep -o '[abc.,]*\>'
,,abc # match to the same point (in this case).
$ echo ',,abc...' | grep -o '[abc.,]*\<'
,, # match to the rightmost **start** of a word.
То же самое можно сделать с пробелами (для отображения пробелов добавлен кот):
До самой правой «границы слова» (любой) (обратите внимание на пробелы):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\b' | cat -A
abcd abcd $
До самого правого «начала слова» (та же точка):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\<' | cat -A
abcd abcd $
До самого правого «конца слова» (без завершающего пробела):
$ echo 'abcd abcd Z' | grep -o '[a-z ]*\>' | cat -A
abcd abcd$
Или с помощью sed:
Четыре границы слов:
$ echo "abc %-= def." | sed 's/\b/ |>X<| /g'
|>X<| abc |>X<| %-= |>X<| def |>X<| .
Два начала слова:
$ echo "abc %-= def." | sed 's/\</ |>X<| /g'
|>X<| abc %-= |>X<| def.
И два окончания слова:
$ echo "abc %-= def." | sed 's/\>/ |>X<| /g'
abc |>X<| %-= def |>X<| .
Ссылка
Из информации GNU sed:
'\b'
Соответствует границе слова; то есть соответствует, если символ слева является символом «слова», а символ справа — символом «не слова», или наоборот.
$ echo "abc %-= def." | sed 's/\b/X/g' XabcX %-= XdefX.
Начало
'<' Соответствует началу слова.
$ echo "abc %-= def." | sed 's/\</X/g' Xabc %-= Xdef.
Конец
'>' Соответствует концу слова.
$ echo "abc %-= def." | sed 's/\>/X/g' abcX %-= defX.