Bash - 在文件中查找关键字并删除其行

时间:2011-08-13 13:34:03

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

我想提供一个关键字,在文件中找到此关键字所在的行并删除整行。

这是我得到的,但它没有按预期工作:

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

请注意:

  • 我指望在删除域名之前总有一个标签

  • 我会自动转义域名的点。

3 个答案:

答案 0 :(得分:15)

使用stream editor,sed:

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

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

答案 1 :(得分:6)

将其传输到另一个文件,而不是您正在阅读的文件,并注意无用的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

答案 2 :(得分:1)

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

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