grep 模式匹配

grep 模式匹配

当我期望以下语句返回 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 $?

相关内容