【问题标题】:Pattern matching digits does not work in egrep?模式匹配数字在 egrep 中不起作用?
【发布时间】:2010-07-06 10:36:52
【问题描述】:

为什么我不能匹配字符串

"1234567-1234567890"

使用给定的正则表达式

\d{7}-\d{10}

在 shell 中使用egrep,如下所示:

egrep \d{7}-\d{10} file

?

【问题讨论】:

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

标签: regex grep character-class


【解决方案1】:

egrep 无法识别 \d 数字字符类的简写,因此您需要使用例如[0-9].

此外,虽然在这种情况下它不是绝对必要的,但引用正则表达式以防止 shell 误解是一个好习惯。因此,这样的事情应该可以工作:

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

另见

参考文献

【讨论】:

  • 其实他只需要引用包含shell元字符的正则表达式。现在它不再包含反斜杠,它不再包含,所以引用是可选的。
  • @sepp2k:你需要报价吗?我想你会的。我想您可以争辩说空格是外壳元字符。无论如何,我认为最好总是引用,ala 最好总是使用花括号。
  • @persistent:根据我链接的比较表,POSIX ERE (egrep) 和 POSIX BRE (grep) 都不知道\d\s\w\b 等。还有\d 不是前缀;它是许多但不是所有风格都支持的数字字符类的简写。
  • @polygenelubricants:是的,您需要带空格的引号(或在每个空格前加上反斜杠)。当然,总是引用并没有什么坏处。
  • @persistent:你不能在 grep/egrep 中使用 \d;您可以使用它的扩展形式[0-9],这实际上是相同的,但稍长一些。在某些支持 Unicode 的风格中,\d[0-9] 不同,因为它还包含一些其他 Unicode 数字字符。
【解决方案2】:

为了完整性:

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

  • [:alnum:]
  • [:alpha:]
  • [:cntrl:]
  • [:数字:]
  • [:graph:]
  • [:lower:]
  • [:print:]
  • [:punct:]
  • [:空格:]
  • [:upper:]
  • [:xdigit:]

示例(注意双括号):

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

【讨论】:

  • 只是对 grep 的抱怨:[[:digit:]] 在各方面都比[[0-9]] 差。这些都不是简写,而且它们比默认的正则表达式语法更难记忆。 EG:[[:lower:]][a-z] 更难记住、读和写
  • @Zombies 但是grep -Eegrep 支持[:digit:][0-9] 那么投诉在哪里?如果您与\d 进行比较,这是有争议的。 d 可以代表任何东西,有点像一个字母的变量名。仍然似乎 \d 变得更受欢迎。我认为 grep 字符类早于 Perl \d
【解决方案3】:

你可以使用\d,如果你通过grep“perl regex”选项,例如:

grep -P "\d{9}"

【讨论】:

  • 是的。谢谢!
  • FreeBSD 中没有。不幸的是,不支持选项 -P。
【解决方案4】:

使用 [0-9] 代替 \d。 egrep 不知道\d。

【讨论】:

【解决方案5】:

试试这个:

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

【讨论】:

  • 传统 egrep 不支持 { 元字符,而一些 egrep 实现支持 \{ ,因此可移植脚本应避免在 egrep 模式中使用 { 并应使用 [{] 来匹配文字 {。
  • 但是传统的 egrep 和 GNU egrep 都不支持 \d ,这就是为什么这不起作用 - 不是因为 {。尽管如果您必须与传统的 egrep 兼容,记住 { 这件事会很有用。
猜你喜欢
  • 2013-07-20
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多