You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据remove.txt内容删除collors.txt中的对应行并保存为output.txt

解决方法

方法一:用grep实现(推荐,高效简洁)

直接用grep的反向匹配功能,一次性完成操作,无需循环:

grep -vxFf remove.txt collors.txt > output.txt

参数说明:

  • -v:反向匹配,输出不匹配的行
  • -x:整行匹配,避免部分字符匹配导致误删(比如不会把"redish"这类行删掉)
  • -F:将匹配内容当作固定字符串处理,而非正则表达式
  • -f:从指定文件(remove.txt)读取匹配规则

执行后output.txt的内容为:

yellow
black
grey

方法二:改进你的sed循环脚本

如果一定要用循环+sed的方式实现,需要注意处理特殊字符和文件读写的问题(这种方法效率较低,仅适合小文件):

remove='remove.txt'
input='collors.txt'
# 先复制原文件到临时文件,避免直接修改原文件导致数据丢失
cp "$input" temp.txt
while IFS= read -r line; do
    # 转义行中的特殊字符(如/、&),防止sed执行报错
    escaped_line=$(printf '%s\n' "$line" | sed 's/[\/&]/\\&/g')
    # 删除临时文件中匹配的整行
    sed -i "/^$escaped_line$/d" temp.txt
done < "$remove"
# 将处理后的临时文件重命名为目标文件
mv temp.txt output.txt

注意:在macOS系统中,sed -i需要加空参数,写法为sed -i "" "/^$escaped_line$/d" temp.txt

方法三:用awk实现

awk是处理文本的高效工具,适合复杂场景的文本处理:

awk 'NR==FNR{remove[$0]=1; next} !remove[$0]' remove.txt collors.txt > output.txt

逻辑说明:

  • NR==FNR:读取第一个文件(remove.txt)时,把每行内容存入数组remove
  • next:跳过后续逻辑,继续读取下一行
  • !remove[$0]:读取第二个文件(collors.txt)时,输出不在remove数组中的行

内容的提问来源于stack exchange,提问作者Cristiano Almeida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:02:13