给定一个典型的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
会这样做。