为列表中的每个模式读取和写入文件似乎非常低效。最好只读取和处理一次文件,一次删除所有 id。
如何执行此操作取决于您在该文件中获得的 ID 类型idlist.txt。从您将模式传递给 的方式grep来看,它们似乎必须是单词或简单的正则表达式,因此您可以尝试以下方法。
首先,将 ID 转换为sed程序:
PROGRAM=$(while read ID; do echo "/$ID/{N;d;}"; done < idlist.txt)
然后用于sed运行程序并就地更新文件:
sed -i '' -e "$PROGRAM" -- file1
程序的工作方式是/$ID/匹配包含 id 的行,然后N命令从文件中读取下一行,然后d命令删除这两行。其他行打印正常。(显然,这取决于是否$ID是一个不包含/字符的有效基本正则表达式。)
如果您有一个sed接受“扩展正则表达式”-r的版本(程序的 GNU 版本的-E选项,或 BSD 版本的选项),那么您可以将所有 ID 编译成一个正则表达式:
PROGRAM=$(printf '/('; tr '\n' '|' < idlist.txt; printf '.^)/{N;d;}')
sed -r -i '' -e "$PROGRAM" -- file1
(这.^是一个不可能匹配的正则表达式;它跟|在正则表达式中的 final 之后,以确保交替中的 final 子句没有匹配。)