在Bash shell中搜索并替换

mat*_*mes 48 bash

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

echo foo
Run Code Online (Sandbox Code Playgroud)

我可以输入以下命令将foo更改为bar:

^foo^bar
Run Code Online (Sandbox Code Playgroud)

这导致执行以下命令:

echo bar
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入:

echo foo foo
Run Code Online (Sandbox Code Playgroud)

有没有办法只使用caret(^)运算符将foo的两个实例更改为bar ?

另外,shell运营商的手册页是否有^man ^导致"没有手动输入^".

Ada*_*eld 59

该特殊功能称为快速替换 ; 其文档可以在Bash手册的Event Designators部分找到.快速替换你不能做你想做的事; 你将不得不诉诸一些更冗长的东西:

!!:gs/foo/bar/
Run Code Online (Sandbox Code Playgroud)


R S*_*hko 34

也不确定如何用插入符号替换,但这是你如何用历史记录做到的:

!!:gs/foo/bar/
Run Code Online (Sandbox Code Playgroud)

让我打破这个:

! - 重新运行最后一个命令.你也可以使用!-2来运行两个命令,!echo来运行以echo开头的最后一个命令

:gs表示要进行全局(所有实例)搜索/替换.如果你想替换第一个实例,你会使用':s'

最后,/ foo/bar /说要用bar替换foo


小智 23

尝试:

^foo^bar^:&
Run Code Online (Sandbox Code Playgroud)

如您所知,^foo^bar^只执行一次替换,:&修饰符会重复它.

  • 这将执行两次替换但不是全局替换. (10认同)
  • 我发现你可以将多个":&"修饰符传递给插入符号替换.所以":&"再次表示,":&:&"再次表示两次,依此类推.(重复:&每次重复都会变得单调乏味,我很高兴了解!!:gs //. (3认同)

Ign*_*ams 5

插入符替换和其他类似的快捷方式可在手册页的HISTORY EXPANSION部分的Event Designators子部分中找到.bash(1)