tags:

views:

115

answers:

2

Occasionally I use the bash command to replace string in previous command:

^foo^bar

Today I wanted to make the replacement in the following line for replacing all occurrences of checkbox with `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

So it only replaces the first occurrence. How do I make it replace all occurrences?

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

man bash says ^old^new is equivalent to !!:s/old/new/. You want !!:gs/old/new/ to globally replace.

profjim
Thanks a lot!AT this point, bash commands suddenly appear very ugly and non-readable. But it's amazing what you can do !
Jesper Rønn-Jensen
I agree! That g definitely belongs at the end!
profjim
Yeah, I pretty sure you want !!:s/old/new/g, so in the case of the original questioner, you want !!:s/checkbox/radio/g
Jim
@Jim, yeah that's how it should work, but it doesn't. Bash history demands the g at the start, not at the end. Putting it at the end will do a single substitution only, followed by a literal "g". Try it.
profjim
@profjim You are correct. Wow, that's confusing.
Jim
@jesper, you are trying to use the c-shell based syntax. maybe have a look at the vi or emacs command line editing interface. much more powerful.
Rob Wells
+3  A: 

An easy way of doing this would be:

fc -s checkbox=radio

I have an alias r defined in my .bashrc:

alias r='fc -s'

Then what you want to do becomes:

r checkbox=radio

See my answer to "hidden features of bash" question for details.

Alok