在Bash shell中搜索并替换

时间:2010-01-27 18:46:50

标签: bash

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

echo foo

我可以通过输入以下内容将foo更改为bar:

^foo^bar

导致执行以下命令:

echo bar

现在,如果我输入:

echo foo foo

有没有办法只使用插入符号(^)将foo的两个实例更改为bar?

此外,是否有^等shell运营商的手册页? man ^导致“没有手动输入^”。

6 个答案:

答案 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