Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

There is a really handy parameter/variable expansion feature in BASH that I don't see for history. I've checked man pages for history and for BASH itself. Not there ...maybe I missed it.

Example: I use ssh a lot and I can do this with variable expansion.

Suppose I wanted to extract just the host -- rather, remove the username.


If I

echo $hostonly

I get:

My question: Is it possible to do this with commandline history?


Command 1:


Command 2:

ssh gary@!!:##*@

This doesn't work, of course, but can someone confirm whether or not this type of pattern matching is available?



share|improve this question
In my examples, it is not particularly advantageous to do what I'm asking. Forget the character counts -- I'm basically just wondering about regex support in bash history substitution. Can it work similarly to variables, in other words. I know about quick s&r with carets as well as the !!:s/// form. Sorry for the confusion! – Bubnoff Mar 9 '11 at 2:54

A neat trick often missed by people is the r command (which is itself a special case of the fc command):

$ ssh
$ r foo=baz

The more general case is

$ fc -s foo=bar ssh

which lets you select a command from the history by substring, then perform the specified substitution and run it. If you leave off the -s, it will load the command into $EDITOR for more complex modification; command line editing mostly makes this unnecessary, but there are some edits that are hard to do on the command line.

You can also do fairly complex manipulation using ! history reference syntax, but for historical reasons (the basic history mechanism was established by early csh and all enhancements have mostly kept compatibility) it uses a different syntax. See here for details.

share|improve this answer
Wasn't aware of the 'r' command. Thanks! – Bubnoff Mar 9 '11 at 3:00
r is an alias which probably needs to be defined (some installations may include it by default in .bashrc). fc still only does string substitutions (it doesn't support wildcards). – Dennis Williamson Mar 9 '11 at 3:24
It will also depend on bash version; r was inherited from ksh, and bash 4 seems to be removing all the ksh-isms. – geekosaur Mar 9 '11 at 3:42
$ ssh
$ ^foo^gary^

The command is repeated using "gary" as the username instead of "foo". The following works the same way:

$ ssh
$ !!:s/foo/gary/
share|improve this answer
I was aware of these methods. But depending on the strings, wildcards would be much quicker. How much regex support is there for examples like your second? – Bubnoff Mar 9 '11 at 2:47
The last caret is unnecessary in example one – Bubnoff Mar 9 '11 at 2:48
@Bubnoff: Unfortunately, Bash history substitution doesn't support wildcards. Zsh, however, does. – Dennis Williamson Mar 9 '11 at 3:01
@Bubnoff: The last slash is also unnecessary in the second example. – Dennis Williamson Mar 9 '11 at 3:02
Thanks Dennis! Definitely a point in Zsh's favor. – Bubnoff Mar 9 '11 at 4:14

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.