关于sed:Bash – 在文件中查找关键字并删除其行

Bash - find a keyword in a file and delete its line

本问题已经有最佳答案,请猛点这里访问。

我想给一个关键字,找到这个关键字的行?在文件中查找并删除整行。

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

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

UPDATE

这对我有用:

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

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

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

1
2
3
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之后的结果:

1
127.0.0.1       localhost       localhost.localdomain

我试过sed -i_bak -e '/\/d' ~/Desktop/hosts但它没有用。

结论

这是我提出的代码(基于优秀人员给我的帮助):

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

注意:

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

  • 我正在自动逃避域名的点。


使用流编辑器,sed:

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

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


将它传输到另一个文件,而不是您正在读取的文件,并小心使用cat

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

除了关于sed的精细答案,你还可以使用Perl和一些改进的正则表达式来解决这个问题:

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

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


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

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