sed regexp / d删除整个文件

给定一个典型的known_hosts文件:

[123.45.67.89]:22 ssh-rsa bbuivvhbkbjdnflksndkfnksnfk... [98.76.54.32]:14444 ssh-rsa hohdibsodbfoasbfbsabdfbsd... [77.34.122.33]:32209 ssh-rsa bksdjncknsdbcksbdcbhdhhb... 

不知道文件中的行号,但知道IP地址。


以下删除文件中的所有行:

 sed '/98\.76\.54\.32/d known_hosts > known_hosts' 

我希望我只是错过了一些荒唐简单的东西。

在这里testing我的正则expression式给了我需要的匹配,我的印象是:

 sed '/pattern/d' file > file 

应该只放下/ pattern /匹配的第一行。


我知道我不是正则大师,也不是bash高手,但我认真地想,这不会是一个search,两个咖啡的战斗。 任何人都可以扔我骨头?


编辑:4分钟的答案,所有权利。 我知道这是荒谬的。 希望我的愚蠢在别人的search中出现。

您必须使用sed-i选项(就地编辑文件):

 sed -i '/98\.76\.54\.32/d' known_hosts 

如果你做了输出redirect,你立即清空文件(在其内容被sed读之前)。 如果您要使用redirect,则必须使用临时输出文件:

 sed '/98\.76\.54\.32/d' known_hosts > known_hosts.tmp mv known_hosts.tmp known_hosts 

而不是sed,使用ssh-keygen -R 98.76.54.32

-R主机名
从known_hosts文件中删除属于主机名的所有密钥。 此选项对于删除散列主机非常有用(请参阅上面的-H选项)

不幸的是,redirect你的输出到你的input文件在这里是对付你的,因为在shell实际启动sed之前输出被打开写和截断。 您需要写入临时文件,或使用sed-i选项。

这是清空文件的输出redirect。 这是因为输出文件在input文件之前打开。 使用sed -i进行到位编辑

 sed -i '/98\.76\.54\.32/d known_hosts 

我同情,正则expression式不是我的朋友。 >正在覆盖文件。 sed -i '/TO DELETE/ d' file.txt会做到这一点。

您可以在Ex模式下使用Vim:

 ex -sc 'g/98\.76\.54\.32/d' -cx known_hosts 
  1. g全球search

  2. d删除

  3. 保存并closures