Unix命令行历史替换 ^foo^bar(用于多次替换)

23

有时我会使用bash命令来替换前一个命令中的字符串:

^foo^bar

今天我想要在下面这行代码中将所有出现的 checkbox 替换为 radio:

$ git mv _product_checkbox_buttons.html.erb _product_checkbox_button.html.erb
$ ^checkbox^radio
git mv _product_radio_buttons.html.erb _product_checkbox_button.html.erb

那么它只替换第一次出现的内容。如何使它替换所有出现的内容呢?

<code>bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
Copyright (C) 2007 Free Software Foundation, Inc.
</code>
2个回答

33

man bash 告诉我们,^old^new 相当于 !!:s/old/new/。如果你需要全局替换,应该使用 !!:gs/old/new/


非常感谢!此时,Bash 命令突然变得非常丑陋和难以阅读。但你能做到的还是很惊人的! - Jesper Rønn-Jensen
我同意!那个 g 明显应该放在最后面! - dubiousjim
1
没错,我敢肯定你想要的是 !!:s/old/new/g ,那么对于原问题提出者而言,你需要这样写:!!:s/checkbox/radio/g。 - Jim
5
@Jim,是的,这就是它应该运作的方式,但实际并非如此。Bash history 要求在开头加上 "g",而不是在结尾处。将它放在结尾处只会进行一次替换,然后跟着一个字面上的 "g"。你可以试试。 - dubiousjim
@jesper,你正在尝试使用基于c-shell的语法。也许可以看一下vi或emacs命令行编辑界面,它们更加强大。 - Rob Wells

14

一个简单的方法是:

fc -s checkbox=radio

我在.bashrc中定义了一个名为r的别名:

alias r='fc -s'

那么你想要做的就是:

r checkbox=radio

查看“Bash的隐藏特性”问题,了解详细信息,请参见我的答案(链接)


这应该是答案,因为它很容易记住,否则每次我需要做这个时都要用谷歌搜索。 - xpt
我喜欢这个命令,胜过于 ^foo^bar^!!:gs/foo/bar/,因为我可以很容易地将其放入别名中。我经常需要运行一个修改过的命令版本,而不仅仅是修正一个打字错误,这使得整个过程更加顺畅。 - dwanderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接