【问题标题】:Unix commandline history substitution ^foo^bar (for multiple replacements)Unix 命令行历史替换 ^foo^bar(用于多个替换)
【发布时间】:2010-02-17 13:03:31
【问题描述】:

偶尔我会使用 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

所以它只替换第一次出现。如何让它替换所有出现的地方?

bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
Copyright (C) 2007 Free Software Foundation, Inc.

【问题讨论】:

    标签: bash unix history


    【解决方案1】:

    man bash 表示^old^new 等价于!!:s/old/new/。您希望 !!:gs/old/new/ 全局替换。

    【讨论】:

    • 非常感谢!此时,bash 命令突然显得非常难看且不可读。但你能做的真是太棒了!
    • 我同意!那个g绝对属于最后!
    • 是的,我很确定你想要 !!:s/old/new/g,所以对于原始提问者来说,你想要 !!:s/checkbox/radio/g
    • @Jim,是的,它应该是这样工作的,但事实并非如此。 Bash 历史要求 g 在开头,而不是结尾。把它放在最后只会做一次替换,后跟一个文字“g”。试试看。
    • @jesper,您正在尝试使用基于 c-shell 的语法。也许看看 vi 或 emacs 命令行编辑界面。更强大。
    【解决方案2】:

    一个简单的方法是:

    fc -s checkbox=radio
    

    我在.bashrc 中定义了别名r

    alias r='fc -s'
    

    那么你想做的就变成了:

    r checkbox=radio
    

    有关详细信息,请参阅my answer 至“hidden features of bash”问题。

    【讨论】:

    • 这应该是 答案,因为它很容易记住,否则每次我需要这样做时我都有谷歌。
    • 比起^foo^bar^!!:gs/foo/bar/,我更喜欢这个,因为我可以轻松地将它放入别名中。我经常想运行命令的修改版本,而不仅仅是修复错字,这使过程更顺畅
    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    相关资源
    最近更新 更多