2012-03-25 80 views
0

我有一个要求,逐行读取文件,并使用-v标志构造管道grep语句以消除这些模式,即我有一个文件,说negativelist,它包含以下模式:在shell脚本中转​​义星号和其他特殊字符

Hello 
World 
Java 

因此,我逐行读取此文件中的行和构建管道grep的语句,如下所示,以从样品中的文件消除这些模式,inputfile中

grep的-v“Hello”输入文件| grep -v“世界”| grep -v“Java”

但是,我在负数列表中声明特殊字符时遇到问题。虽然我通常会使用grep -v'*'inputfile来消除包含星号的所有行,但我似乎无法完成此工作。用负数列表中的单引号转义星号似乎没有帮助。使用我目前使用双引号从负数列表中读取的任何行的方法,可以消除包含它的行的任何想法?

为了澄清,我有以下组约束:

  • grep的管道字符串由以下形式的脚本构建: 的grep -v “从negativelist LINE1” inputfile中 | grep的-v“2号线从negativelist ...等等
  • 此外,该脚本运行此grep命令和存储其输出在另一个文件中。
  • 我只能控制所发生在双引号之间,由限定所述图案在negativelist。我不能改变的方式脚本生成这些管道的grep语句
  • 即使想我通过执行的grep得到所希望的输出“*” inputfile中从命令行,只需存储*在否定列表不会产生所有包含a在他们的sterisk。
  • 此外,限定图案如你好。*世界消除形式

    Hellotest1World的所有行,或

    Hellotest2World

negativelist定义时没有按” t似乎可能工作或者星号不正确地逃脱。在命令行下面的语句正常工作:grep的-v“你好*世界” inputfile中 ,也就是说,它正确地消除含有您好所有行随后以任何字符(S),其次是世界

回答

2

你应该之间使用fgrep而不是只是grep,即执行精确匹配而不扩展任何内容。

例:

$ cat /tmp/a 
aaa 
zzz 
eee 
*** 
rrr 
ttt 
yyy 

$ fgrep -v -e 'aaa' -e '*' -e zzz -e yyy /tmp/a 
eee 
rrr 
ttt 
+0

感谢您的建议。假设我不能使用fgrep作为构建这些管道语句的脚本不是我控制的,那么您是否还有其他建议? – Rishabh 2012-03-25 14:33:49

+0

已编辑帖子。你控制什么? 'grep'也可以这样使用:'grep'\ *'' – 2012-03-25 14:40:48

+0

生成管道grep语句的脚本实际上用双引号包围* negativelist *中的每一行。考虑到这个约束,我应该如何在*负数列表中声明星号? – Rishabh 2012-03-25 14:41:37