Sed regexp /d 删除整个文件

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'

我希望我只是错过了一些非常简单的事情。

测试我的正则表达式这里给了我我需要的匹配,我的印象是:

sed '/pattern/d'  file > file

应该只删除第一行/图案/匹配。


我知道我不是正则表达式专家也不是 bash 大师,但我真的认为这不会是一场几次搜索、两杯咖啡的战斗。有人能给我点建议吗?


编辑:几分钟内就得到了 4 个答案,还好。我知道这太荒谬了。希望我的愚蠢行为能在别人的搜索中显现出来。

答案1

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

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

如果你像之前一样进行输出重定向立即地清空文件(在读取其内容之前sed)。如果要使用重定向,则必须使用临时输出文件:

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

答案2

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

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

答案3

不幸的是,将输出重定向到输入文件在这里对您不利,因为在 shell 实际启动之前,输出会被打开进行写入并被截断sed。您需要写入临时文件,或使用-i选项sed

答案4

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

相关内容