首页 > 解决方案 > 尝试 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 这样的变量,它可以包含正常模式和带有元字符(如 $ 或 ^)的模式作为正则表达式工作?

标签: linuxbashgrep

解决方案


停止pattern在文件中搜索文本的上下文中使用这个词,因为它是模棱两可的 - 总是使用stringor regexp,无论你是什么意思。在文件中搜索字符串是:

grep -F 'string' file

并搜索(BRE)正则表达式是:

grep 'regexp' file

由于您希望$在末尾tmp$被视为正则end-of-string表达式元字符,因此您必须要在正则表达式上匹配,因此您可以使用:

grep -v "$EXCLUSIONS" file

顺便说一句,为了避免与已经导出并存在于您的环境中的其他变量名称发生冲突,除非您的变量已导出,否则不要使用所有大写的变量名称。


推荐阅读