我不理解GNU sed和GNU grep中\b
和\<
之间的区别。在我看来,\b
总是可以替换\<
和\\>
,而无需更改匹配字符串集。
更具体地说,我试图找到\bsomething
和\\< something
的示例
不匹配完全相同的字符串。
something\b
和something\\>
的相同问题。
谢谢
答案 0 :(得分:12)
我怀疑你是否使用(更常见的)\b
或(更具体的)\<
和\>
几乎没有什么区别,但我可以想到一个例子它会在哪里。这是非常人为的,我怀疑在大多数现实世界正则表达式中使用它并没有什么区别,但这应该证明它至少可以在某些情况下有所作为。
如果我有以下文字:
this is his pig
我想知道/\bis\b/
是否匹配,如果我改为使用/\<is\>/
或者改为使用/\>is\</
但是,如果我的文字是
,该怎么办?is this his pig
在'is'之前不再有单词最终边界,只有单词初始边界。使用/\bis\b/
匹配,当然还有/\<is\>/
,但/\>is\</
不会。
在现实生活中,我认为你真的需要能够做出这种区分并不常见,这就是为什么(至少在sed之外)\b
是常规的正常单词边界标记的原因表达式。
答案 1 :(得分:7)
\<
匹配从非单词到单词的转换。
\>
匹配从单词到非单词的转换。
\b
相当于扩展正则表达式中的(\<|\>)
。
所以我不会说\b
和\<
是一样的。我会说\b
是\<
的超集。反之亦然\b
和\>
。
答案 2 :(得分:2)
答案 3 :(得分:1)
根据LinuxTopia,两种类型的单词边界之间的唯一区别是,虽然\<
和\>
适用于大多数sed版本;后者\b
仅在您的系统使用 gsed
来自维基的引文:
这些符号包括'\&lt;'和'&gt;' (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
---------------------------------------------------------------