如何获取列表并将其从文件中删除?


10

我有一长串需要从/ etc / remotedomains中删除的域名。它们可能不在文件中以任何特定顺序排列。每个域都在一行上。

我如何遍历列表并在远程域中找到该行并将其删除。

Answers:


11
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,也不行foobarbarfoo


3
注意:永远记得备份/etc/localdomains/etc/remotedomains做这样的东西了。
xenoterracide

3
-F用于固定字符串匹配(“完全匹配”),但强制模式匹配整个行。POSIX指定-x标志以将匹配项限制为模式与整行匹配的实例。
克里斯·约翰森

@克里斯:ah,好收获。
sepp2k 2010年

1

使用通讯!

comm -23 /etc/remotedomains remove

从手册页:

逐行比较排序的文件FILE1和FILE2。

如果没有选项,则产生三列输出。第一列包含FILE1独有的行,第二列包含FILE2独有的行,第三列包含两个文件共同的行。

选项-1,-2和-3禁用相应的列。

但是,它确实要求对文件进行排序。


0

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

笔记:

  1. 使用-i.bak sed备份domainlist.txt

  2. 如果removelist.txt有许多数千个条目,就可能溢出的最大命令行长度。这不是很可能的情况,但您应该注意一些事情。

进一步思考,可以通过以下方法消除该风险:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.