Bash

sed regexp /d 刪除整個文件

  • April 13, 2016

給定一個典型的 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...

不知道文件中的 line#,但知道 ip 地址。


以下將刪除文件中的所有行:

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

我希望我只是錯過了一些荒謬的簡單事情。

在這裡測試我的正則表達式給了我我需要的匹配,我的印像是:

sed '/pattern/d'  file > file

*應該只刪除/pattern/*匹配的第一行。


我知道我不是正則表達式大師也不是 bash 大師,但我認真地認為這不會是一場多次搜尋、兩次咖啡大戰。誰能給我一根骨頭?


編輯:幾分鐘內有 4 個答案,好吧。我知道這很荒謬。希望我的愚蠢出現在別人的搜尋中。

您必須使用(就地編輯文件)-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

代替 sed,使用ssh-keygen -R 98.76.54.32

-R hostname

從 known_hosts 文件中刪除屬於 hostname 的所有鍵。此選項對於刪除散列主機很有用(請參閱上面的 -H 選項)

引用自:https://serverfault.com/questions/261160