【发布时间】:2012-03-25 14:24:10
【问题描述】:
我需要逐行读取文件并构造一个管道 grep 语句以使用 -v 标志消除这些模式,即我有一个文件,比如说 negativelist,它包含以下模式:
Hello
World
Java
因此,我逐行读取此文件并按如下方式构造管道 grep 语句以从示例文件 inputfile
中消除这些模式grep -v "Hello" 输入文件 | grep -v "世界" | grep -v "Java"
但是,我在否定列表中声明特殊字符时遇到了问题。虽然我通常会使用 grep -v '*' inputfile 来消除所有包含星号的行,但我似乎无法完成这项工作。在 negativelist 中用单引号转义星号似乎没有帮助。关于我应该如何转义星号以便能够消除包含它的行的任何想法,使用我目前使用双引号包围从 negativelist 读取的任何行的方法?
为了澄清,我有以下一组约束:
- grep 管道字符串由以下形式的脚本构造: grep -v "line1 from negativelist" inputfile | grep -v "line2 from negativelist ... 以此类推
- 此外,此脚本运行此 grep 命令并将其输出存储在另一个文件中。
- 我只能通过定义 negativelist 中的模式来控制双引号之间的内容。我无法更改脚本生成这些管道 grep 语句的方式
- 即使我认为我通过从命令行执行 grep "*" inputfile 来获得所需的输出,只是将 * 存储在 negativelist 中并不会产生所需的删除结果所有包含星号的行。
-
进一步,定义诸如Hello.*World之类的模式来消除表单的所有行
Hellotest1World,或
Hellotest2World
在 negativelist 中定义时似乎不起作用,也可能星号未正确转义。命令行上的以下语句正常工作: grep -v "Hello.*World" inputfile ,即它正确地消除了所有包含 Hello 后跟任何字符的行,然后是 World
【问题讨论】: