2008-08-26 123 views
4

有沒有辦法在bash中的當前行上運行regexp-string替換?Bash reg-exp替換

我經常發現自己處於這種情況,在那裏我輸入了一個很長的命令行,然後意識到,我想在行中某處改變一個單詞。

我目前的做法是,以結束此行,按按Ctrl + 一個(去行的開始),插入#(註釋掉線),按回車鍵,然後使用^oldword^newword語法(^oldword^newword在用舊字替換舊字後執行前一個命令)。

但是,必須有一個更好(更快)的方式來實現這一點。 (鼠標不可能,因爲我大部分時間都在ssh會話中)。

可能有一些類似emacs的鍵盤命令,我不知道。

編輯:我試過使用vi模式。發生了一些奇怪的事情雖然我是一個愛着vim的用戶,但我使用我心愛的bash遇到了嚴重的麻煩。所有那些燃燒到我的潛意識中的手指動作突然停止工作。我很快回到了emacs模式,並考慮給emacs嘗試一下我最喜歡的編輯器(儘管我猜,同樣的事情可能會再次發生)。

回答

1

不幸的是,沒有,沒有更好的方法。如果你只是厭倦了擊鍵,你可以使用宏來修剪它們。以下添加到您的~/.inputrc

"\C-x6": "\C-a#\C-m^" 
"\C-x7": "\C-m\C-P\C-a\C-d\C-m" 

現在,在一個新的bash實例(或按C-x C-r在當前的shell重裝.inputrc後),您可以執行以下操作:

  1. 鍵入一個假的命令(例如,ls abcxyz)。
  2. 按Ctrl-x,然後6.該宏在該行的開頭插入一個#,執行註釋行並鍵入您的第一個^。 (請輸入xyz^def)。
  3. 按Ctrl-x,然後按7.該宏完成您的替換,然後上一行(註釋)行,刪除註釋字符,並再次執行它。

這不完全是優雅的,但我認爲這是最好的,你會用readline得到。

3

G'day,

那麼使用vi模式呢?只要輸入設置-o vi

然後,你可以去你想改變的單詞,只要做一個CW或CW取決於什麼是在這個詞?

糟糕,忘記添加你輸入一個ESC k到o到命令歷史記錄中的上一行。

你通常使用什麼編輯器?

歡呼聲, 羅布

編輯:我忘了我原來的答覆說的是,你需要使用的時候你是在「前」模式下,你輸入的命令在bash認爲vi命令行vi,即在輸入冒號後。

最糟糕的是,你需要使用h(左)和l(右)古老的vi命令來瀏覽命令歷史。你可以使用w(或W)來跨越單詞反彈。

一旦你習慣了它,你可以使用各種命令,例如,進入ESC/my_command會回顧你的歷史,最近的第一個,找到包含文本my_command的命令行的第一個出現。一旦找到了,你可以使用n來查找下一個發生等,並且N可以反轉搜索的方向。

我會去閱讀bash的手冊頁,看看在vi模式下有什麼可用的。一旦你瞭解到向上箭頭和向下箭頭被ESC k和j替代的事實,你會發現vi模式提供了比bash中的命令行編輯更多的emacs模式。

恕我直言natchurly! ( - :

Emacs?八十megs和不斷交換!

歡呼聲, 羅布

3
在KSH

,在vi模式下,如果你打「V」,而在命令模式下它會在你的當前命令行的內容生成一個完整的vi會話。然後,您可以使用全部的vi命令進行編輯(全局搜索和替換)。何時:從vi輸入wq,執行編輯後的命令。我相信類似的東西存在bash。由於bash傾向於擴展它的前輩,所以可能有類似的東西。

+0

它確實也適用於Bash,我想說當你想用你當前的命令行完成全面的「編輯器」時,這是最好的答案。 – jwd 2016-08-17 21:46:12