插入search并在Bash shell中进行replace

如果我刚刚在Bash中input以下命令:

echo foo 

我可以通过input以下内容来改变foo:

 ^foo^bar 

这会导致执行以下命令:

 echo bar 

现在,如果我input:

 echo foo foo 

有没有办法通过使用脱字号( ^ )运算符将foo的两个实例更改为bar?

另外,是否有像shell这样的操作符? man ^导致“没有手动input^”。

这个特殊的function被称为快速替代 ; 其文档可以在“Bash手册”的“ 事件指示器”部分find。 你不能快速替代你想做的事情; 你将不得不诉诸稍微更冗长的东西:

 !!:gs/foo/bar/ 

也不知道如何做脱发替代,但这是你如何做的历史:

 !!:gs/foo/bar/ 

让我打破这一点:

! – 重新执行最后的命令。 你也可以使用!-2在前面运行两个命令,!echo运行最后一个以echo开头的命令

:gs说要做一个全球(所有实例)的search/replace。 如果你只想replace第一个实例,你可以使用':s'

最后,/ foo / bar /说用条代替foo

尝试:

 ^foo^bar^:& 

如你所知, ^foo^bar^只执行一次replace, :&修饰符重复它。

插入replace和其他类似的快捷方式可在bash(1)手册页的HISTORY EXPANSION部分的Event Designators部分中find。

 ^word^ ........... erase word ^word^^ ........... delete everything until the end of the line 

如果你正在寻找一些难以记忆的东西来完成与上面相同的事情!!:gs/foo/bar/ ,你可以在你的.bash_profile启动脚本中创build一个函数。 我select了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 } 

那么所有的replace都可以用

 echo foo foo replace foo bar