为什么这种模式在egrep中不起作用?

use*_*622 56 regex grep character-class

为什么我不能匹配字符串

"1234567-1234567890"
Run Code Online (Sandbox Code Playgroud)

使用给定的正则表达式

\d{7}-\d{10}
Run Code Online (Sandbox Code Playgroud)

egrep从这样的外壳:

egrep \d{7}-\d{10} file
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 69

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

而且,虽然在这种情况下并不是绝对必要,但引用正则表达式来防止shell的误解是一种好习惯.因此,这样的事情应该有效:

egrep '[0-9]{7}-[0-9]{10}' file
Run Code Online (Sandbox Code Playgroud)

也可以看看

参考

  • @persistent:根据我链接的比较图,POSIX ERE (egrep) 和 POSIX BRE (grep) 都不知道 `\d`、`\s`、`\w`、`\b` 等。还有 `\d`不是前缀;它是许多但不是所有风格支持的数字字符类的简写。 (2认同)

And*_*zlo 23

为了完整性:

事实上,Egrep确实支持角色类.课程是:

  • [:alnum:]
  • [:α:]
  • [:CNTRL:]
  • [:数字:]
  • [:图形:]
  • [:降低:]
  • [:打印:]
  • [:PUNCT:]
  • [:空间:]
  • [:上:]
  • [:xdigit:]

示例(注意双括号):

egrep '[[:digit:]]{7}-[[:digit:]]{10}' file
Run Code Online (Sandbox Code Playgroud)

  • 只是抱怨grep:`[[:digit:]]`比任何可能的方式都要比`[[0-9]]更差.这些都不是简写,并且它们比默认的正则表达式语法更难记忆.EG:`[[:lower:]]`比"[az]"更难记忆,读写 (3认同)

rog*_*ack 16

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

grep -P "\d{9}"


sep*_*p2k 11

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