如果我刚刚在Bash中输入以下命令:
echo foo
我可以通过输入以下内容将foo更改为bar:
^foo^bar
导致执行以下命令:
echo bar
现在,如果我输入:
echo foo foo
有没有办法只使用插入符号(^
)将foo的两个实例更改为bar?
此外,是否有^
等shell运营商的手册页? man ^
导致“没有手动输入^”。
答案 0 :(得分:57)
该特定功能称为快速替换;其文档可以在Bash手册的Event Designators部分找到。快速替换你不能做你想做的事;你将不得不诉诸一些更冗长的东西:
!!:gs/foo/bar/
答案 1 :(得分:33)
不确定如何使用插入符号替换,但这是您使用历史记录的方式:
!!:gs/foo/bar/
让我打破这一点:
!! - 重新运行最后一个命令。你也可以使用!-2来运行两个命令,!echo来运行以echo
开头的最后一个命令:gs表示要进行全局(所有实例)搜索/替换。如果你想替换第一个实例,你可以使用':s'
最后,/ foo / bar /说用条替换foo
答案 2 :(得分:23)
尝试:
^foo^bar^:&
如您所知^foo^bar^
仅执行一次替换,而:&
修饰符会重复此操作。
答案 3 :(得分:5)
Caret替换和其他类似的快捷方式可在bash(1)
手册页的 HISTORY EXPANSION 部分的事件指示符小节中找到。
答案 4 :(得分:1)
^word^ ........... erase word
^word^^ ........... delete everything until the end of the line
答案 5 :(得分: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