正则表达式和 grep 不起作用

正则表达式和 grep 不起作用

我有以下正则表达式:

([:digit:]{4})-([:digit:]{1,2})-([:digit:]{1,2})

它应该获取以下格式的日期:

2010-12-19

我正在将它用在如下文件名上:

2010-12-19-xxx-xxx-xxx.markdown

而且,当我像这样使用它时grep

echo $POST | grep -oE "([:digit:]{4})-([:digit:]{1,2})-([:digit:]{1,2})" # $POST is the filename

这不起作用,我只感到空虚。

答案1

尝试这个:-

echo $POST | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"

如果我在这里尝试,我会得到:-

[andys@daedalus ~]$ echo "2010-12-19-aaa-bbb-ccc-ddd.markdown" | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"
2010-12-19

希望这就是您所寻找的。

答案2

安迪的回答很好,但如果你想要更接近原始语法的东西,你可以尝试:

echo $POST | egrep -oE "([[:digit:]]{4})-([[:digit:]]{1,2})-([[:digit:]]{1,2})"

这里需要 egrep 来扩展正则表达式,以及双括号来表示字符类。

答案3

您不需要括号,但需要更多方括号。字符类具有与单个字符相同的特征。就像您可能搜索这样的元音:[aeiou],或这样的数字:[0123456789]或这样的数字:[0-9],您也需要将类(例如[:digit:]或)括[:upper:]在括号表达式中:([[:xdigit:]]十六进制数字)。

grep -oE "[[:digit:]]{4}-[[:digit:]]{1,2}-[[:digit:]]{1,2}"

相关内容