我有两个文件。
file.txt
和delete.txt
file.txt
包含以下内容:
/somedirectory/
/somedirectory2/somefile.txt
/anotherfile.txt
delete.txt
包含:
/somedirectory/
/somedirectory2/somefile.txt
我需要删除file.txt
delete.txt
行
cat file.txt
的结果应为:
/anotherfile.txt
到目前为止,我已经尝试过这个没有运气了:
while read p; do
line=$p;
sed -i '/${line}/d' file.txt;
done < delete.txt
我没有收到任何错误,它只是没有编辑我的file.txt
文件。我用echo ${line}
测试了while循环,它在该场景中按预期工作。
有什么建议吗?
注意:即使我从文件中删除正斜杠,上面的while循环也不会按预期工作。
答案 0 :(得分:5)
使用简单的grep
:
grep -vFxf delete.txt file.txt > temp.txt && mv temp.txt file.txt
答案 1 :(得分:3)
使用awk
:
awk 'NR==FNR {a[$0]=1; next}; !a[$0]' delete.txt file.txt
NR==FNR {a[$0]=1; next}
仅针对delete.txt
文件(第一个文件参数)执行;关联数组a
将记录作为键,1
作为每个键的值
!a[$0]
针对第二个文件参数执行,即file.txt
;打印(默认操作)数组a
中不存在的记录作为键
示例:强>
% cat delete.txt
/somedirectory/
/somedirectory2/somefile.txt
% cat file.txt
/somedirectory/
/somedirectory2/somefile.txt
/anotherfile.txt
% awk 'NR==FNR {a[$0]=1; next}; !a[$0]' delete.txt file.txt
/anotherfile.txt
答案 2 :(得分:3)
单引号内的$ {line}不会扩展,因此它会在file.txt中查找实际字符串$ {line}。将它放入您的示例文件中以查看它是否被删除。
但是,您仍然会遇到问题,因为删除文本中的斜杠将被sed解释,因此正则表达式不会被正确分隔。为了使用sed,你必须跳过一些箍来让输入行中的每个字符正确引用为文字。
答案 3 :(得分:1)
改为使用comm
:
comm -23 file.txt delete.txt
但是必须对输入文件进行排序。如果他们不是:
comm -23 <(sort file.txt) <(sort delete.txt)