sed和grep中单词的开头和结尾

时间:2013-06-29 16:22:03

标签: regex sed

我不理解GNU sed和GNU grep中\b\<之间的区别。在我看来,\b总是可以替换\<\\>,而无需更改匹配字符串集。

更具体地说,我试图找到\bsomething\\< something的示例 不匹配完全相同的字符串。

something\bsomething\\>的相同问题。

谢谢

4 个答案:

答案 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)

我之前偶然发现了这样一个例子。
\&LT; \&GT;匹配一个字母的单词。
使用\ b你需要输入类似\ b [^] \ b的东西,因为\ b。\ b匹配两个单词之间的空格。

答案 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
  ---------------------------------------------------------------