Bash(grep)正则表达式意外执行

Nli*_*tis 8 regex bash shell grep

我有一个文本文件,其中包含一个日期dd/mm/yyyy(例如20/12/2012).

我试图用来grep解析日期并在终端中显示它,并且它是成功的,直到我遇到某个案例:

这些是我的测试用例:

  • grep -E "\d*" 返回20/12/2012
  • grep -E "\d*/" 返回20/12/2012
  • grep -E "\d*/\d*" 返回20/12/2012
  • grep -E "\d*/\d*/"没有回报
  • grep -E "\d+"没有回报

有人可以向我解释为什么我会出现这种意外行为吗?

编辑:如果我用"(弱引号)替换(强引号),我会得到相同的行为'.

Sha*_*hin 12

Bash的Extended regex\d无法识别您使用的语法().

使用grep -PPerl正则表达式(PCRE)代替.例如:

grep -P "\d+/\d+/\d+" input.txt
grep -P "\d{2}/\d{2}/\d{4}" input.txt  # more restrictive
Run Code Online (Sandbox Code Playgroud)

或者,为了坚持使用扩展正则表达式,请使用[0-9]以下代码\d:

grep -E "[0-9]+/[0-9]+/[0-9]" input.txt
grep -E "[0-9]{2}/[0-9]{2}/[0-9]{4}" input.txt  # more restrictive
Run Code Online (Sandbox Code Playgroud)