Начало и конец слов в sed и grep

Я не понимаю разницы между b и < в GNU sed и GNU grep. Мне кажется b всегда можно заменить < и > без изменения набора соответствующих строк.

более конкретно, я пытаюсь найти примеры, в котором bsomething и < something не совпадают точно те же строки.

тот же вопрос для somethingb и something>.

спасибо

4 ответов


я подозреваю, что очень редко имеет значение, используете ли вы (более распространенный) \b или (точнее) \< и \>, но я могу придумать пример, где это было. Это довольно надуманно, и я подозреваю, что в большинстве реальных регулярных выражений это не имеет значения, но это должно продемонстрировать, что это по крайней мере мог бы сделать разницу в некоторых случаях.

если у меня есть следующий текст:

this is his pig

и я хочу знать если /\bis\b/ матчи, это не имело бы значения, если бы я вместо этого использовал /\<is\>/ или я использую /\>is\</

но что, если мой текст был вместо

is this his pig

перед "есть" больше нет конечной границы слова, только начальная граница слова. Используя /\bis\b/ матчи, и конечно /\<is\>/ тоже, но /\>is\</ нет.

в реальной жизни, однако, я думаю, что это не часто, что вам действительно нужно иметь возможность сделать это различие, поэтому (по крайней мере, снаружи sed)\b является нормальным маркером границы слова для регулярных выражений.


\< соответствует переходу от не-слово в слово.

\> соответствует переходу от слова к не-слову.

\b эквивалентно (\<|\>) в расширенных регулярных выражений.

поэтому я не скажу \b и \< то же самое. Я бы сказал \b - это надмножество \<. Наоборот \b и \>.


по данным LinuxTopia единственное различие между двумя типами границ слов заключается в том, что в то время как \< и \> работа в большинстве версий sed; последний \b работает только если ваша система использует gsed

и цитата из Вики:

эти символы включают "\ "(gsed, ssed, sed15, sed16, sedmod) и "\b " и "\B " (только gsed).

кроме этого два идентичный. Также Вот таблица, которая объясняет все возможные сценарии, использующие границы слов:

  Match position      Possible word boundaries   HHsed   GNU sed
  ---------------------------------------------------------------
  start of word    [nonword char]^[word char]      \<    \< or \b
  end of word         [word char]^[nonword char]   \>    \> or \b
  middle of word      [word char]^[word char]     none      \B
  outside of word  [nonword char]^[nonword char]  none      \B
  ---------------------------------------------------------------

я наткнулся на такой пример раньше.
\<.> соответствует слову из одной буквы.
Используя \b, вам нужно будет поставить что-то вроде \b [^] \b, потому что \b.\b соответствует пробелу между двумя словами.