我正在编写的脚本试图grep出不匹配的模式,其中模式作为bash变量提供给grep函数。现在,变量现在仅包含一个模式'tmp $',用于grep输出以tmp结尾的记录。 这是它的代码
cat file | grep -v -F "${EXCLUSIONS}"
其中EXCLUSIONS是变量
cat file:
/bin/xyz
/bin/abc
/tmp/dir/abc
/helloworld/tmp
echo $EXCLUSIONS:
tmp$
/bin
#Here I want the output to be only /tmp/dir/abc as one pattern\
#to exclude is anything that ends with tmp or /bin
输出仍然包含以tmp结尾的条目,我认为这是因为它不认为 tmp $ 结尾的 $ 为正则表达式模式。 bash中是否有一种方法可以实现此工作,在这里我可以使用像EXCLUSION这样的变量,该变量既可以包含普通模式,也可以包含带有$或^等元字符的模式以用作正则表达式?
答案 0 :(得分:0)
在模棱两可的文件中搜索文本时,请停止使用单词pattern
-始终使用string
或regexp
,无论您是什么意思。要在文件中搜索字符串,是:
grep -F 'string' file
并搜索(BRE)正则表达式为:
grep 'regexp' file
由于您希望将$
末尾的tmp$
视为end-of-string
正则表达式元字符,因此必须在正则表达式上进行匹配,然后使用:>
grep -v "$EXCLUSIONS" file
顺便说一句,为避免与已经导出并存在于环境中的其他变量名冲突,除非导出了变量,否则不要使用所有大写的变量名。
答案 1 :(得分:-1)
我认为您不应该使用-F,这意味着“固定字符串”并且不支持Regex。 并且EXCLUSIONS不应以$结尾。您应该使用$来指定grep中的行尾。 看这个例子。
cat test.txt
row1
row2
row3
1tmp
2tmp
tmp1
tmp2
echo $EXCLUSIONS
tmp
cat test.txt | grep -v ${EXCLUSIONS}$
row1
row2
row3
tmp1
tmp2
我希望它会有用。