2010-01-27 29 views
39

如果我剛剛進入Bash中下面的命令:插入符號搜索和Bash shell中替換

echo foo 

我可以改變FOO通過鍵入吧:

^foo^bar 

導致下面的命令執行:

echo bar 

現在,如果我輸入:

echo foo foo 

有沒有辦法通過使用插入符號(^)運算符將foo的兩個實例更改爲bar?

此外,還有手冊頁外殼運營商如^man ^結果爲「無手動輸入^」。

+2

感謝您的答案進行,希望換一種方式來使用重複的^語法,因爲這是我可以更容易記住的事情,但看起來我必須記住線路噪聲版本。 – mattjames 2010-01-27 19:12:22

+1

如果您還認爲'^ string1^string2'已經等同於'!!:s/string1/string2 /',那麼您可能更容易記住「線路噪音」版本。 – isomorphismes 2013-01-03 18:45:38

+0

@mattjames如果你想要更容易記住的東西,你可以看看我的答案,這是更少的「線噪音」-y – MLP 2017-08-17 22:55:31

回答

48

取代富那種特定功能被稱爲快速替換 ;其文檔可在Bash手冊的Event Designators部分找到。你不能快速替代你想做的事情;你得稍微詳細訴諸東西:

!!:gs/foo/bar/ 
+0

@scanny:這似乎沒有記錄在任何地方,它不適用於我bash 4.2.10(1)。你使用的是什麼版本的shell('bash --version')? – 2013-09-27 14:56:41

+0

糟糕,我的錯誤,大腦上的zsh! :S刪除評論。 – scanny 2013-09-27 20:45:42

+0

我在OSX上不需要尾部斜線:'!!:gs/foo/bar' – 2015-07-29 21:22:19

27

也不知道如何與插入符號替代做到這一點,但這裏是你如何與歷史做:

!!:gs/foo/bar/ 

讓我打破下來:

! - 重新執行最後的命令。您還可以使用-2到兩個命令前運行,呼應運行回聲

開始最後的命令:!GS說做一個全球性的(所有實例)查找/替換。如果你想只是更換第一個實例,你可以使用「:S」

最後,/富/酒吧/說,與巴

5

插入符號替代和其他類似的快捷方式在事件標誌款的bash(1)手冊頁的歷史擴展部分被發現。

1
^word^ ........... erase word 
^word^^ ........... delete everything until the end of the line 
+3

這些對我來說都是一樣的:只從命令中移除單詞。 – 2011-06-01 05:22:46

+0

同樣在這裏。 '%回聲「字逐字逐字」 字逐字逐字 %^字^^ 回聲「字字字字」 逐字逐字 ' – isomorphismes 2013-01-03 18:43:18

21

嘗試:

^foo^bar^:& 

正如你所知道^foo^bar^執行只是一個替代,而:&修改重複它。

+9

這將執行兩個換人,但不是全局替換。 – isomorphismes 2013-01-03 19:14:34

+2

我發現你可以將多個「:&」修飾符傳遞給插入符替換。所以「:&」再次表示,而「:&:&」又表示兩次,依此類推。 (重複:&爲每個重複將變得乏味,並且我很高興知道!!:gs //。 – rickumali 2016-10-19 14:41:05

0

如果您正在尋找難以記憶的東西,完成與上述!!:gs/foo/bar/相同的事情,您可以隨時在.bash_profile啓動腳本中創建一個函數。我選擇了replace()

replace() { 
    eval $(echo $(fc -ln -1) | eval "sed 's/${1}/${2}/g'") #compact form 
} 

,或較少迴旋

replace() { 
    string=$(fc -ln -1) #gets last command string 
    repcmmd="sed 's/${1}/${2}/g'" #build replacement sed command from fn input 
    eval $(echo $string | eval $repcmmd) #evaluates the replacement command 
} 

然後替換所有可以

echo foo foo 
replace foo bar