【问题标题】:Why does egrep -o not return the entire match?为什么 egrep -o 不返回整个匹配项?
【发布时间】:2014-11-14 16:22:43
【问题描述】:

我有一个文件“foo”,其中包含以下内容。:

mPosixHello
mPosixWorld
mPosix->ThisWontPrint()
mPosix.NorWillThis()

在命令行中,我输入:

egrep 'mPosix\B+' foo

正如预期的那样,它返回:

mPosixHello
mPosixWorld

现在,让我们将命令更改为:

egrep -o 'mPosix\B+' foo

输出返回不是我所期望的:

mPosix
mPosix

这是为什么?我希望看到与第一次运行相同的输出。我认为 -o 打印出匹配的实际子字符串而不是整行(在这种情况下,除了换行符之外它们是相同的东西?嗯...)

一些有用的信息:

> egrep --version
egrep (GNU grep) 2.12


> uname -a
Linux TSU-Debian-Dev 3.2.0-4-amd64 #1 SMP Debian 3.2.63-2 x86_64 GNU/Linux

感谢任何见解。谢谢!

【问题讨论】:

  • 既然已经回答了“为什么”的问题,我将把它作为评论发布:从你的“代码”来看,看起来你正在寻找一个类似于 egrep -o 'mPosix[a-zA-Z0-9]+' foo
  • 是的,你是对的。我只是懒惰,并认为我可以做到这一点。

标签: regex grep


【解决方案1】:

\B 不是字符类。它是类似于 $(行尾)或 ^(行首)的 word boundry

锚是不同的品种。它们根本不匹配任何字符。相反,它们匹配字符之前、之后或之间的位置。它们可用于将正则表达式匹配“锚定”在某个位置。

TLDR;

anchors != 字符类,

\b 和 \B 基本上忽略了 + 和 *

【讨论】:

  • 啊,好的,谢谢。我喜欢与开始/结束线的类比。我认为这是一个美化的 [..] '下面'。感谢您为我澄清这一点。
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 2013-11-25
  • 1970-01-01
  • 2020-10-19
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多