Ссылка

Ссылка

На странице руководства 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.

Связанный контент