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