在shell脚本中,使用带有正则表达式的grep来查找文件中的文本不起作用

时间:2017-08-09 02:18:11

标签: regex bash grep

我有一个名为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。那是为什么?

2 个答案:

答案 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