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

评论

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

#1 楼

您可以使用!!: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


参考文献



Bash命令行历史记录权威指南
在Bash shell中进行Caret搜索和替换


评论


@slm这个命令只是为我替换了第一个实例。 [subhrcho @ slc04lyo pcbpel] $回声“蝙蝠的帽子” [bathrcho @ slc04lyo pcbpel] $ !!:gs / at / xx /回声“蝙蝠的hxx”蝙蝠的hxx。我想念什么?

–极客
2014-02-24 6:35



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

–slm♦
14年2月24日在6:39

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

–极客
14年2月24日在6:40

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

–slm♦
2014-2-24在6:41

#2 楼

我不相信有一种简单的方法可以向^string1^string2添加内容以使bash替换每次出现的情况。正如slm所指出的,您必须编写!!:gs/string1/string1

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

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


bashzsh,也可以像这样使用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


评论


哇真的也很整洁

–梅森
2014年2月24日,下午3:54

#3 楼

我相信最好的选择是使用“:&”
$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat

,但是就像下面的StéphaneChazelas所评论的那样,这仅替换了2次出现。如果还有更多,则需要添加更多:&

评论


这将替换2个事件,而不是全部(在此示例中全部替换,因为只有2个事件,但在一般情况下不是)。您需要添加尽可能多的:&,因为要替换的事更多。

–StéphaneChazelas
19年4月30日在17:14