转载自:
摘要: shell中有很多好用的小tip,学习中从这儿那儿都学到一些,今天遇到的问题是使用shell的历史命令替换符号^,但是遇到一点小问题。
shell中有种种好用的小tip,其中关于历史命令的主要是感叹号!
比如!!是执行上一条命令,!$是上一次命令中最后一个参数,!*是上一次命令中所有的参数等等。
不记得在哪儿看到过使用^来替换命令中字符的用法(bash支持,sh不支持,ksh,zsh等没研究)。例如:
[lyu@MaxIo-DO ~]$ ls abls: cannot access ab: No such file or directory[lyu@MaxIo-DO ~]$ ^ab^abcls abcabc
^ab^abc 的作用就是将上一条命令中的ab替换成abc,当然ls ab的命令很简单,这么用不是很值得,但是当你的参数很长很多的时候,你重新敲或者翻到上一条命令再移动光标进行修改就很麻烦了,这时候^的作用就体现出来了。
可是今天,我在替换一个命令的时候发现了问题,简单说明如下:
[lyu@MaxIo-DO ~]$ ls ab abls: cannot access ab: No such file or directoryls: cannot access ab: No such file or directory[lyu@MaxIo-DO ~]$ ^ab^abcls abc abls: 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."
好吧,虽然没有^方便了,但是还是很好用的,不过注意到回答中也提到了,bash丑陋的地方:g竟然放在命令的开头,还不是像sed vim等处理时放在最后。
好了~ 问题解决了,shell中还有很多小技巧等你来发现哦~!