为列表中的每个模式读取和写入文件似乎非常低效。最好只读取和处理一次文件,一次删除所有 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 子句没有匹配。)