我有一个包含单词(每行一个)的文件,例如
狗
鱼
猫
鞋
我有一个 CSV 格式的辅助文件,例如
1、鞋子、红色
2、苹果、黑色
3、雾、蓝色
我想使用 grep 以第一个文件作为搜索模式,如果辅助文件中的某一行包含第一个文件中的单词,我想完全删除辅助文件中的该行。
我不确定 grep 是否是解决这个问题的方法。
编辑:bash 脚本
答案1
您可以使用grep
的-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
详细解释:
grep
— 不言自明-v
— 表示“返回与输入模式不匹配的行”-i
— 表示“使用不区分大小写的匹配”(因为您的第一个文件有大写字母,而 CSV 没有)-f
— 表示“将指定文件 (file1.txt
) 中的每一行解释为用于匹配的模式”
根据您想要的结果和文件的内容,您可能还需要阅读-F
和-w
选项。
如果您需要就地编辑文件,我认为您可以使用选项来执行此sed
操作-f
,但sed
将文件的每一行解释为一个命令,而不是像那样的简单模式grep
。