Начало и конец слов в 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 соответствует пробелу между двумя словами.