插入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