我试图删除包含列表中任何单词的文本中的行。例如:
文件 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 的行。但它如何在多个单词或文件中的单词中工作?
我试图删除包含列表中任何单词的文本中的行。例如:
文件 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 的行。但它如何在多个单词或文件中的单词中工作?
您可以通过以下方式轻松做到这一点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
试试这个:
grep -vFwf file2 file1