我不明白 GNU sed 和 GNU grep 之间的\b
区别\<
。在我看来,\b
总是可以替换\<
并且\\>
不更改匹配字符串集。
\bsomething
更具体地说,我试图找到\\< something
不完全匹配相同字符串的示例。
something\b
和的相同问题something\\>
。
谢谢
\b
我怀疑无论您使用(更常见)还是(更具体)\<
and ,它很少会产生\>
影响,但我可以想到一个例子。这是非常人为的,我怀疑在大多数现实世界的正则表达式中使用它不会有所作为,但这应该表明它至少在某些情况下会有所作为。
如果我有以下文字:
this is his pig
我想知道是否/\bis\b/
匹配,我是否使用/\<is\>/
或我是否使用都没有关系/\>is\</
但是,如果我的文字是
is this his pig
在“is”之前不再有词尾边界,只有词首边界。使用/\bis\b/
火柴,当然/\<is\>/
也可以,但/\>is\</
没有。
但是,在现实生活中,我认为您确实需要能够做出这种区分并不常见,这就是为什么(至少在 sed 之外)\b
是正则表达式的正常单词边界标记的原因。
\<
匹配从非单词到单词的转换。
\>
匹配从单词到非单词的转换。
\b
相当于(\<|\>)
扩展正则表达式。
所以我不会说\b
和\<
都是一样的。我会说\b
是\<
. 反之亦然。\b
_\>
我之前偶然发现了这样一个例子。
\<.\> 匹配一个单字母单词。
使用 \b 您需要输入 \b[^ ]\b 之类的内容,因为 \b.\b 匹配两个单词之间的空格。
根据LinuxTopia的说法,这两种类型的单词边界之间的唯一区别是while\<
和\>
work 在大多数 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
---------------------------------------------------------------