【问题标题】:Beginning and end of words in sed and grepsed 和 grep 中单词的开头和结尾
【发布时间】:2013-06-27 06:19:55
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 只是不同的正则表达式约定;它们是等价的,但拼写不同。
  • 还请确保将答案标记为已接受。这样你会增加你的可信度,人们会更加努力地回答你的问题

标签: regex sed


【解决方案1】:

我怀疑无论您使用(更常见的)\b 还是(更具体的)\<\>,它几乎不会产生影响,但我可以想到一个例子。这是相当做作的,我怀疑在大多数现实世界的正则表达式使用中它不会有所作为,但这应该表明它至少在某些情况下可以有所作为。

如果我有以下文字:

this is his pig

我想知道/\bis\b/ 是否匹配,我使用/\<is\>/ 还是使用/\>is\</ 都没有关系

但是如果我的文字是代替的呢

is this his pig

“is”之前不再有词尾边界,只有词首边界。使用/\bis\b/ 匹配,当然/\<is\>/ 也匹配,但/\>is\</ 不匹配。

不过,在现实生活中,我认为您确实需要能够做出这种区分并不常见,这就是为什么(至少在 sed 之外)\b 是正则表达式的正常单词边界标记。

【讨论】:

  • 只是为了添加书签:在 OS X 上,您需要使用 [[:<:>:]] 作为单词边界。使用 \b 或 \
  • 感谢@PetrusRepo!这很容易知道。
  • 嗯,/\&gt;is\&lt;/ 永远不会匹配,不是吗? \&gt; 匹配左边有单词字符,右边有非单词字符。但我们也希望看到右边的i,这是一个单词字符。
【解决方案2】:

\&lt; 匹配从非单词到单词的转换。

\&gt; 匹配从单词到非单词的转换。

\b 等价于扩展正则表达式中的(\&lt;|\&gt;)

所以我不会说\b\&lt; 是一样的。我想说\b\&lt; 的超集。 \b\&gt; 反之亦然。

【讨论】:

  • 是的,但你能举一个实际的例子,它会有所作为吗?是否有任何正则表达式(及其匹配的文本)通过使用\b 而不是\&lt;\&gt; 得到不同的结果?
  • @iconoclast 早就应该有人回答这个问题了。如果您周围没有单词/非单词字符,那将会有所不同。 sed 's/\&gt;/#/g' 不会做与 sed 's/\b/#/g' 相同的事情。如果在边界匹配旁边有一个非单词或单词字符(或明确是其中之一的类),它们将明确具有相同的行为。
  • @Taywee iconoclast 3 年前做过answer their own question
  • perl 的位(例如psed)翻译如下:\&lt;\b(?&lt;=\W)\&gt;\b(?=\W)
【解决方案3】:

我之前偶然发现了这样一个例子。
\<.> 匹配一个单字母单词。
使用 \b 您需要输入 \b[^ ]\b 之类的内容,因为 \b.\b 匹配两个单词之间的空格。

【讨论】:

    【解决方案4】:

    根据LinuxTopia,这两种单词边界的唯一区别是\&lt;\&gt; 在大多数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
      ---------------------------------------------------------------
    

    【讨论】:

    • 我认为提问者并不关心哪些版本的 sed 支持哪些约定。他的版本似乎支持两者,而他的问题似乎是关于使用其中一个或另一个是否会产生任何实际差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多