当我期望以下语句返回 0 时,它总是返回 1:
echo "ACI123456777-001-20170701.pdf" | grep -e "^ACI([0-9]{9})-([0-9]{3})-([0-9]{8}).pdf$"
答案1
您观察到代码 1 的退出,如下所示:
$ echo "ACI123456777-001-20170701.pdf" | grep -e "^ACI([0-9]{9})-([0-9]{3})-([0-9]{8}).pdf$"; echo code=$?
code=1
为了让它按您的预期工作,您需要 -E` 选项:
$ echo "ACI123456777-001-20170701.pdf" | grep -Ee "^ACI([0-9]{9})-([0-9]{3})-([0-9]{8}).pdf$"; echo code=$?
ACI123456777-001-20170701.pdf
code=0
-E
打开扩展正则表达式功能。
如果您确实想使用基本的正则表达式(这是默认值),那么您需要添加几个转义符:
$ echo "ACI123456777-001-20170701.pdf" | grep -e "^ACI\([0-9]\{9\}\)-\([0-9]\{3\}\)-\([0-9]\{8\}\).pdf$"; echo code=$?
ACI123456777-001-20170701.pdf
code=0
的含义-e
grep 选项-e
位于正则表达式模式之前:
$ echo "ACI123456777-001-20170701.pdf" | grep -e '^ACI'
ACI123456777-001-20170701.pdf
如果只有一种模式,则 grep 不需要-e
,您可以省略它:
$ echo "ACI123456777-001-20170701.pdf" | grep '^ACI'
ACI123456777-001-20170701.pdf
但是,如果-e
需要两个或多个模式:
$ echo "ACI123456777-001-20170701.pdf" | grep -e '^ACI' -e 'pdf'
ACI123456777-001-20170701.pdf
答案2
echo "ACI123456777-001-20170701.pdf" | grep -q "ACI[0-9]\{9\}-[0-9]\{3\}-[0-9]\{8\}.pdf"
echo $?