egrep中的数字匹配模式不能正常工作?

75

为什么我不能匹配这个字符串

"1234567-1234567890"

使用给定的正则表达式

\d{7}-\d{10}

使用Shell中的egrep,可以这样做:

egrep \d{7}-\d{10} file
抱歉,我只能处理英文语言的任务。

3
我刚刚尝试了 /\d{7}-\d{10}/,并且对该字符串起作用。 - xil3
它不起作用;我已经将上面的字符串写入文件中 - 但是什么都没有?! - user377622
@persistent:也许你需要编写一个十六进制编辑器,看看那些数字字符到底是什么。 - polygenelubricants
嘿:D; 这只是一个简单的数字,通过echo从标准输出转发;将字符串echo到文件中。 - user377622
5个回答

96

egrep不能识别\d作为数字字符类的简写,所以你需要使用例如[0-9]

此外,在这种情况下虽然不是绝对必要的,但最好引用正则表达式,以防止Shell误解。因此,像这样做应该可以:

egrep '[0-9]{7}-[0-9]{10}' file

参见

参考资料


2
根据我分享的比较表,无论是 POSIX ERE(egrep)还是 POSIX BRE(grep)都不支持\d\s\w\b等。此外,\d并不是前缀;它是许多但不是所有类型都支持的数字字符类的简写。 - polygenelubricants
1
@polygenelubricants:是的,你需要在空格处加引号(或在每个空格前加反斜杠)。当然,总是加引号也无妨。 - sepp2k
1
@persistent:在grep/egrep中不能使用\d,但可以使用其扩展形式[0-9],它们实际上是相同的,只是稍微长一些。在某些支持Unicode的版本中,\d[0-9]不同,因为它还包括其他一些Unicode数字字符。 - polygenelubricants
我从不使用[0-9],当我真正需要的是[[:digit:]]。此外,这些字符类几乎被所有地方支持,并且在POSIX中定义。 - J. M. Becker
'\d' 今天在我的电脑上不起作用,但 '\s' 和 '\w' 能正常使用。grep (GNU grep) 2.23 Packaged by Homebrew。 - Pysis
显示剩余7条评论

27

为了完整性:

Egrep实际上支持字符类。这些类别是:

  • [:alnum:]
  • [:alpha:]
  • [:cntrl:]
  • [:digit:]
  • [:graph:]
  • [:lower:]
  • [:print:]
  • [:punct:]
  • [:space:]
  • [:upper:]
  • [:xdigit:]

示例(注意双括号):

egrep '[[:digit:]]{7}-[[:digit:]]{10}' file

3
仅仅是关于grep的抱怨:[[:digit:]]在所有可能的情况下都不如[[0-9]]好。这两者都不是简写,而且比默认的正则表达式语法更难记。例如:[[:lower:]][a-z]更难记、读和写。 - Zombies
@Zombies 但是grep -E,即egrep支持[:digit:][0-9],所以哪里有抱怨?如果你正在与\d进行比较,那么这是可以争论的。d可以代表任何东西,就像一个字母变量名。似乎\d已经变得更加流行。我认为grep字符类比Perl\d更早。 - Jason S

22

如果使用“perl正则表达式”选项,你可以使用\d来进行匹配,例如:

grep -P "\d{9}"


是的。谢谢! - Chris
1
不支持FreeBSD操作系统。很遗憾,不支持-P选项。 - Mike Makarov
如果你正在运行 AWS CodeBuild,则仍会遇到此问题,你需要使用 grep -P - Ken J

11

使用[0-9]代替\d。例如,egrep不认识\d。


根据http://www.regular-expressions.info/gnu.html,`grep`中的重复是`\{7\}`。 - polygenelubricants
@polygenelubricants:当然,我以为他在问\d。 - sepp2k

-3

试试这个:

egrep '(\d{7}-\d{10})' file

1
传统的egrep不支持{元字符,一些egrep实现支持{,因此可移植的脚本应避免在egrep模式中使用{,而应使用[{]来匹配字面意义上的{。 - Nikhil Jain
然而,传统的 egrep 和 GNU egrep 都不支持 \d,这就是为什么它不起作用的原因 - 不是因为 {。虽然如果您需要与传统的 egrep 兼容,牢记 { 这个事情也很有用。 - sepp2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接