BASH 歷史記錄操作:搜尋替換

BASH 歷史記錄操作:搜尋替換

BASH 中有一個非常方便的參數/變數擴展功能,我在歷史上從未見過。我檢查了歷史記錄和 BASH 本身的手冊頁。不在那裡……也許我錯過了。

範例:我經常使用 ssh,我可以透過變數擴展來做到這一點。

[email protected]

假設我只想提取主機 - 相反,刪除用戶名。

hostonly=${host##*@}

如果我

echo $hostonly

我得到:

bar.org

我的問題: 是否可以透過命令列歷史記錄來做到這一點?

例如。

命令1:

ssh [email protected]

命令2:

ssh gary@!!:##*@

當然,這是行不通的,但是有人可以確認這種類型的模式匹配是否可用嗎?

謝謝!

布布諾夫

答案1

人們經常錯過的一個巧妙的技巧是命令r(它本身就是命令的一個特例fc):

$ ssh [email protected]
(...)
$ r foo=baz

更一般的情況是

$ fc -s foo=bar ssh

它允許您透過子字串從歷史記錄中選擇命令,然後執行指定的替換並運行它。如果您省略-s,它將載入該命令$EDITOR以進行更複雜的修改;命令列編輯大多數情況下不需要這樣做,但有些編輯很難在命令列上完成。

您也可以使用!歷史引用語法進行相當複雜的操作,但由於歷史原因(基本歷史機制是早期建立的csh,所有增強功能大多保持相容性)它使用不同的語法。看這裡了解詳情。

答案2

$ ssh [email protected]
...
$ ^foo^gary^
...

使用“gary”而不是“foo”作為用戶名重複該命令。以下的工作方式相同:

$ ssh [email protected]
...
$ !!:s/foo/gary/
...

相關內容