8

我有一个文本文件,其中包含格式为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+"也不返回任何内容

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

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

4

4 回答 4

12

Bash 的扩展正则表达式\d无法识别您使用的语法 ( ) 。

改用grep -P使用 Perl 正则表达式 (PCRE)。例如:

grep -P "\d+/\d+/\d+" input.txt
grep -P "\d{2}/\d{2}/\d{4}" input.txt  # more restrictive

或者,要坚持使用扩展的正则表达式,请[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
于 2013-01-15T14:49:17.030 回答
4

您也可以使用 -P 而不是 -E 允许 grep 使用 PCRE 语法

grep -P "\d+/\d+" file

也可以。

于 2013-01-15T14:49:27.773 回答
2

grepegrep/grep -E不认识\d。您的前三个模式起作用的原因是星号使\d可选。它实际上是找不到的。

使用[0-9][[:digit:]]

于 2013-01-15T14:47:22.340 回答
2

为了帮助解决此类情况,-o 标志可能会有所帮助,因为它仅显示该行的匹配部分。用你原来的表达方式:

grep -Eo "\d*"什么都不返回 - 提示 \d 没有按照您的想法进行操作。

grep -Eo "\d*/"返回 / (两次) - 确认 \d 不匹配而斜杠匹配。

正如其他人所指出的,-P 标志通过识别“\d”来解决问题,但为了澄清爆炸药丸的答案,您也可以使用 -E,如下所示:

grep -Eo "[[:digit:]]*/[[:digit:]]*/"返回 20/12/

编辑:根据@shawn-chin 的评论(谢谢!),--color 可以类似地用于突出显示匹配的行部分,同时仍显示整行:

grep -E --color "[[:digit:]]*/[[:digit:]]*/"返回20/12/ 2012 (不能在这里做颜色,但粗体“20/12/”部分将是彩色的)

于 2013-01-15T15:07:58.093 回答