转载自:https://my.oschina.net/maxio/blog/526709


摘要: shell中有很多好用的小tip,学习中从这儿那儿都学到一些,今天遇到的问题是使用shell的历史命令替换符号^,但是遇到一点小问题。


shell中有种种好用的小tip,其中关于历史命令的主要是感叹号!

比如!!是执行上一条命令,!$是上一次命令中最后一个参数,!*是上一次命令中所有的参数等等。

不记得在哪儿看到过使用^来替换命令中字符的用法(bash支持,sh不支持,ksh,zsh等没研究)。例如:

[lyu@MaxIo-DO ~]$ ls ab
ls: cannot access ab: No such file or directory[lyu@MaxIo-DO ~]$ ^ab^abc
ls abc
abc

^ab^abc 的作用就是将上一条命令中的ab替换成abc,当然ls ab的命令很简单,这么用不是很值得,但是当你的参数很长很多的时候,你重新敲或者翻到上一条命令再移动光标进行修改就很麻烦了,这时候^的作用就体现出来了。

可是今天,我在替换一个命令的时候发现了问题,简单说明如下:

[lyu@MaxIo-DO ~]$ ls ab ab
ls: cannot access ab: No such file or directoryls: cannot access ab: No such file or directory[lyu@MaxIo-DO ~]$ ^ab^abc
ls abc ab
ls: cannot access ab: No such file or directoryabc

可以看到,^只是替换了命令中的第一个匹配项,但是我需要的是全部替换,这可怎么办呢?!

一番Google以后,在StackOverFlow上找到了答案:

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

http://stackoverflow.com/questions/2280778/unix-commandline-history-substitution-foobar-for-multiple-replacements

好吧,虽然没有^方便了,但是还是很好用的,不过注意到回答中也提到了,bash丑陋的地方:g竟然放在命令的开头,还不是像sed vim等处理时放在最后。

好了~ 问题解决了,shell中还有很多小技巧等你来发现哦~!