转义shell脚本中的星号和其他特殊字符

时间:2012-03-25 14:24:11

标签: regex shell grep

我需要逐行读取文件并使用-v标志构建一个管道grep语句以消除这些模式,即我有一个文件,比如 negativelist ,包含以下模式:

Hello
World
Java

因此,我逐行读取此文件并按如下方式构造管道grep语句,以从示例文件中消除这些模式, inputfile

grep -v“Hello”inputfile | grep -v“世界”| grep -v“Java”

但是,在否定列表中声明特殊字符时,我遇到了问题。虽然我通常会使用grep -v'*' inputfile 来消除包含星号的所有行,但我似乎无法使其工作。使用否定列表中的单引号转义星号似乎没有帮助。有关如何逃避星号的任何想法,以便我能够消除包含它的行,使用我当前的方法围绕从否定列表读取的双引号行吗?

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

  • grep管道字符串由脚本构成,格式如下: grep -v“line1 from negativelist inputfile | grep -v“line2 from negativelist ...等等
  • 此外,此脚本运行此grep命令并将其输出存储在另一个文件中。
  • 我只能通过定义否定列表中的模式来控制双引号之间的内容。我无法改变脚本生成这些管道grep语句的方式
  • 即使我想通过从命令行执行grep“*” inputfile 来获得所需的输出,只需将*存储在否定列表中就不会产生所需的删除结果所有包含星号的行。
  • 此外,定义一个模式,如Hello。* World,以消除表格中的所有行

    Hellotest1World,或

    Hellotest2World

否定列表中定义似乎无法正常工作时,星号可能无法正常转义。命令行上的以下语句正常工作:grep -v“Hello。* World” inputfile ,即它正确地消除了包含Hello的所有行,后面跟着World

之间的任何字符

1 个答案:

答案 0 :(得分: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