0

我试图删除包含列表中任何单词的文本中的行。例如:

文件 1:

xxx yyy, zzz,
aaa bbb, sss,
ccc fff, zzz,
rrr www, qasd,

文件 2:

xxx
zzz
rrr

目标是删除 file1 中包含 file2 中任何单词的行。所以输出应该是:

aaa bbb, sss,  

我知道如何将 sed 与单个单词一起使用,例如 sed '/zzz/d' 来删除包含 zzz 的行。但它如何在多个单词或文件中的单词中工作?

4

2 回答 2

2

您可以通过以下方式轻松做到这一点grep

$ grep -Fwvf file2 file1
aaa bbb, sss,

选项:

-f 文件,--文件=文件

从 FILE 中获取模式,每行一个。空文件包含零个模式,因此不匹配任何内容。(-f 由 POSIX 指定。)

-v,--反转匹配

反转匹配的感觉,选择不匹配的行。(-v 由 POSIX 指定。)

-w, --word-正则表达式

仅选择那些包含构成整个单词的匹配项的行。测试是匹配的子字符串必须在行首,或者前面有一个非单词组成字符。同样,它必须位于行尾或后跟非单词组成字符。构成单词的字符是字母、数字和下划线。

-F,--固定字符串

将 PATTERN 解释为固定字符串的列表,由换行符分隔,其中任何一个都将被匹配。(-F 由 POSIX 指定。)

要将更改存储回file1

$ grep -Fwvf file2 file1 > tmp && mv tmp file1
于 2013-03-14T11:08:01.107 回答
1

试试这个:

grep -vFwf file2 file1
于 2013-03-14T11:10:09.327 回答