![Bash:替换上一条命令中出现的单词的所有位置](https://linux22.com/image/1268038/Bash%EF%BC%9A%E6%9B%BF%E6%8D%A2%E4%B8%8A%E4%B8%80%E6%9D%A1%E5%91%BD%E4%BB%A4%E4%B8%AD%E5%87%BA%E7%8E%B0%E7%9A%84%E5%8D%95%E8%AF%8D%E7%9A%84%E6%89%80%E6%9C%89%E4%BD%8D%E7%BD%AE.png)
几乎是偶然地,我发现你可以做类似的事情:
$ cp foo.data bar1.data
$ ^bar1^bar2
这会用bar2.data
而不是 来运行相同的命令bar1.data
。现在,如果我有多个目标单词出现怎么办?例如:
$ cp foo.data bar.data
$ ^data^index
它只替换了第一个data
扩展。我该如何让它替换两个扩展?
答案1
我认为^data^index
相当于!!:s/data/index
,所以它只会替换第一个单词。如果你想替换整行,我认为你必须使用!!:gs/data/index/
答案2
您可以通过在末尾添加 ^:& 来实现。
^:& 将替换两次出现的情况
^:g& 将替换所有出现的情况
$ cp foo.data bar.数据 $ ^数据^索引^:& $ cp foo.index bar.index
$ cp foo.数据 bar.数据 joe.数据 doe.数据 $ ^数据^索引^:g& $ cp foo.index bar.index joe.index doe.index
旁注:在《命令行功夫》一书中,
它说 ^:& 将替换所有