Answers:
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains
该-v告诉grep来不匹配的模式只输出线。
该-f list告诉grep来从文件中读取模式list。
该-F告诉grep来解释模式为纯字符串,而不是正则表达式(这样你就不会遇到与正则表达式元字符的麻烦)。
该-x告诉grep来整条生产线相匹配,例如,如果有一个模式foo只应删除行foo,也不行foobar或barfoo。
-F用于固定字符串匹配(“完全匹配”),但不强制模式匹配整个行。POSIX指定-x标志以将匹配项限制为模式与整行匹配的实例。
sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt
如果您要删除的域列表在文件中,则:
sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt
笔记:
使用-i.bak sed备份domainlist.txt
如果removelist.txt有许多数千个条目,就可能溢出的最大命令行长度。这不是很可能的情况,但您应该注意一些事情。
进一步思考,可以通过以下方法消除该风险:
for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
/etc/localdomains和/etc/remotedomains做这样的东西了。