我有以下正则表达式:
([: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}"