如何根据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)时,把每行内容存入数组removenext:跳过后续逻辑,继续读取下一行!remove[$0]:读取第二个文件(collors.txt)时,输出不在remove数组中的行
内容的提问来源于stack exchange,提问作者Cristiano Almeida
相关产品推荐
相关产品推荐

