我有一个名为test.txt
的文件,其中包含以下内容:
1 2 3
我有以下脚本使用正则表达式匹配数字之间的至少一个空白字符:
#!/bin/sh
if ! grep -q -e "1[ \t]+2[ \t]+3" test.txt; then
echo "not found"
else
echo "found"
fi
执行脚本打印出not found
,但它应打印出found
。那是为什么?
答案 0 :(得分:1)
按照grep man:
基本与扩展正则表达式
在基本正则表达式中,元字符?,+,{,|,(和) 失去他们的特殊意义;而是使用backslashed版本\?, \ +,\ {,\ |,\(和\)。
尝试:
#!/bin/sh
if ! grep -q -e "1[ \t]\+2[ \t]\+3" test.txt; then
echo "not found"
else
echo "found"
fi
答案 1 :(得分:0)
好吧,我试着编辑另一个答案,这个答案目前不正确。但编辑是rejected,所以我必须发布自己的答案,因为评论是“second class citizens on the Stack Exchange network, not designed to hold information for all eternity [and] may get cleaned up at any time.”
如其他答案中所述,-e
选项仅支持基本正则表达式(意味着+
没有特殊含义)。因此,-E
选项应该用于扩展正则表达式,它支持+
元字符。
此外,grep仅支持POSIX正则表达式,它不会将\t
识别为制表符。修复此问题的最简单方法是在保持可读性且不使用任何实验性grep选项(例如-P
)的同时,将[ \t]
替换为[[:space:]]
。
因此固定脚本如下所示:
#!/bin/sh
if ! grep -q -E "1[[:space:]]+2[[:space:]]+3" test.txt; then
echo "not found"
else
echo "found"
fi