使用 grep 从文件中删除包含来自另一个文件的字符串的行

Jas*_*ost 5 bash grep awk sed command-line

我有一个包含单词(每行一个)的文件,例如





我有一个 CSV 格式的辅助文件,例如

1,鞋子,红色
2,苹果,黑色
3,雾,蓝色

我想使用 grep 将第一个文件作为搜索模式,如果辅助文件中的一行在第一个文件中包含一个单词,我想完全删除辅助文件中的该行。

我不确定 grep 甚至是解决这个问题的方法。

编辑:bash 脚本

kin*_*ine 10

您可以使用grep's-f选项(小写-f,而不是-F)执行此操作:

% echo -e 'Dog\nFish\nCat\nShoes' > ./file1.txt 
% echo -e '1,shoes,red\n2,apple,black\n3,fog,blue' > ./file2.csv 

# Grab all lines from the CSV that match a pattern from file1:
% grep -if ./file1.txt ./file2.csv
1,shoes,red

# Grab all lines from the CSV that DON'T match a pattern from file1:
% grep -vif ./file1.txt ./file2.csv
2,apple,black
3,fog,blue
Run Code Online (Sandbox Code Playgroud)

详细解释:

  • grep — 不言自明
  • -v — 表示“返回与输入模式不匹配的行”
  • -i — 表示“不区分大小写的匹配”(因为您的第一个文件有大写字母而 CSV 没有)
  • -f— 表示“将指定文件 ( file1.txt)中的每一行解释为用于匹配的模式”

根据您想要的结果和文件的内容,您可能还需要阅读-F-w选项。

如果您需要就地编辑文件,我认为您可以使用sed's-f选项执行此操作,但sed将文件的每一行解释为命令,而不是像do 这样的简单模式grep