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

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

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

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

答案1

grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains

告诉-vgrep 仅输出与模式不匹配的行。

告诉-f listgrep 从文件中读取模式list

告诉-Fgrep 将模式解释为纯字符串,而不是正则表达式(这样您就不会遇到正则表达式元字符的麻烦)。

告诉-xgrep 匹配整行,例如,如果有一个模式foo应该只删除行foo,而不是行foobarbarfoo

答案2

使用通讯!

comm -23 /etc/remotedomains remove

从手册页:

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

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

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

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

答案3

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

相关内容