上一个命令中所有实例的^ x ^ y unix技巧?


97

我最喜欢的Unix技巧之一是^x^y,它将接受最后一个命令,并将“ x”的第一个实例替换为“ y”。但是,我想知道在上一个命令中是否有类似的技巧可以将“ x”的所有实例替换为“ y”?


2
该功能称为历史扩展。看起来我们command-history为此使用了标记。添加。另外,我假设您指的是bash外壳程序?
Mikel

Answers:


107

您可以使用该!!:gs/search/replace/符号执行所需的操作。这利用了全局搜索和替换(:gs):

之前

$ echo "harm warm swarm barm"
harm warm swarm barm

$ !!:gs/arm/orn/
echo "horn worn sworn born"
horn worn sworn born

参考文献


1
@slm这个命令只是为我替换了第一个实例。[subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat。我想念什么?
极客2014年

@Geek-您的发行版是什么?您正在使用Bash吗?版?bash --version= 4.2.45(1)-发布。
slm

@slm GNU bash,版本3.2.25(1)-发行版(x86_64-redhat-linux-gnu)版权所有(C)2005自由软件基金会,公司
Geek 2014年

@Geek-版本太旧,不提供此功能。
slm

45

我不相信有一个简单的方法来添加的东西^string1^string2,使bash更换所有出现。正如slm所指出的,您必须编写!!:gs/string1/string1

但在中zsh,您只需添加:G

$ echo foo foo
foo foo
$ ^foo^bar^:G
echo bar bar
bar bar

bash和中zsh,您还可以fc -s像这样使用:

$ echo foo foo
foo foo
$ fc -s foo=bar
echo bar bar
bar bar

这通常被称为别名,r因此您可以执行以下操作:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar

哇,这真的也很整齐
梅森

2

我认为最好的选择是使用“:&”

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat

3
这将替换2个事件,而不是全部(在本示例中全部替换,因为只有2个事件,但在一般情况下不是)。您需要添加的:&副本数量要多得多。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.