【问题标题】:Bash - find a keyword in a file and delete its line [duplicate]Bash - 在文件中查找关键字并删除其行[重复]
【发布时间】:2011-10-26 09:57:45
【问题描述】:

我想给出一个关键字,在文件中找到该关键字出现的那一行,然后擦除整行。

这是我得到的,但它不能正常工作:

KEYWORD='domain.com'
cat /etc/hosts | grep -v "$KEYWORD" > /etc/hosts

更新

这对我有用:

sed -i_bak -e '/domain\.com/d' /etc/hosts

但是,由于我有两行“domain.com”,有没有办法告诉 sed 只删除确切关键字“domain.com”出现的行

这是/etc/hosts的原始内容:

127.0.0.1       localhost       localhost.localdomain
222.111.22.222      hvn.domain.com
222.111.22.222      domain.com

在命令sed -i_bak -e '/domain\.com/d' /etc/hosts 之后它是这样结束的:

127.0.0.1       localhost       localhost.localdomain

我试过sed -i_bak -e '/\<namourphoto\.com\.br\>/d' ~/Desktop/hosts,但没用。

结论

这是我想出的代码(基于好人给我的帮助):

D=domain.com
DOMAIN=`echo "$D" | sed 's/\./\\\\./g'`
sed -i_bak -e "/[\t]$DOMAIN/d" /etc/hosts

注意:

  • 我在计算要擦除的域之前总是有一个标签

  • 我正在自动转义域名的点。

【问题讨论】:

  • 另请注意,点在正则表达式中具有特殊含义,因此domain.com 也将匹配domainxcom.net。您应该转义点。
  • 我必须在''之间转义点吗?
  • 是的,你知道。试试echo abc | grep 'a.c',输出将是abc
  • 我写了一个代码(上面)来自动转义点
  • [\t] 部分添加一个空格,因为 /etc/hosts 是空格分隔的。

标签: bash sed grep command-line-interface replace


【解决方案1】:

使用stream editor,sed:

sed -i ".bak" '/culpa/d' test.txt

以上将删除 test.txt 中包含 culpa 的行。它将创建原始文件(名为 test.txt.bak)的备份,并就地修改原始文件。

【讨论】:

  • 我的测试不适用于 -i 和 .bak 之间的空格。但是当我 pu -i.bak 它确实有效。
  • 如何在不做备份的情况下丢弃原件?更新:刚刚将“.bak”引用留空以回答我自己的问题。
  • 在我的情况下,关键字是带有. 和端口: 的ipaddress 对吗? sed -i "/$proxy[^0-9]/d" proxy.txt
【解决方案2】:

将它传送到另一个文件,与您正在读取的文件不同,并注意cat的无用使用。

grep -v "$KEYWORD" /etc/hosts > newfile

除了给出关于 sed 的正确答案外,您还可以使用 Perl 和稍微改进的正则表达式来解决这个问题:

perl -pi.old -e 's/.*\sdomain\.com\s*\n//' file

请注意,我正在考虑 domain.com 将被空格字符(制表符或空格等)隔离,并且在换行之前,除了零个或多个空格之外什么都不会出现。与 sed 中的-i 类似,
perl 中的-i.old 设置$^I 变量,您的原始文件将收到更改,而副本将保留在旧名称下并附加.old

【讨论】:

  • 有没有办法使用这种方法进行编辑,或者我总是需要制作另一个文件才能编辑它?
  • @Roger,我更新了答案。
  • 非常优雅的代码,谢谢。
  • @Roger: De nada, e bonito cachoro。 Será que essa área verde aí atrás é aqui em SP? :P
  • 折纸,嗯,秋田。 Sim, a paisagem é no Morro do Ouro, em Apiaí;相信吗?
【解决方案3】:

如果您只想删除示例文件的最后一行

sed -i '/[[:space:]]\+domain\.com/d' test.txt

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2012-06-20
    • 2017-04-26
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多