最後のコマンドのすべてのインスタンスに対する^ x ^ y unixトリック?


97

私のお気に入りのUnixのトリックの1つは、^x^y最後のコマンドを受け取り、「x」の最初のインスタンスを「y」に置き換えることです。しかし、最後のコマンドで「x」のすべてのインスタンスを「y」に置き換えるために同様のトリックが機能するかどうか疑問に思っていますか?


2
この機能は履歴拡張と呼ばれます。command-historyそのためにタグを使用しているようです。追加されました。また、bashシェルを参照していると思いますか?
ミケル14

回答:


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。私は何が欠けていますか?
オタク14

@Geek-あなたのディストリビューションは何ですか?Bashを使用していますか?版?bash --version= 4.2.45(1)-リリース。
slm

@slm GNU bash、バージョン3.2.25(1)-release(x86_64-redhat-linux-gnu)Copyright(C)2005 Free Software Foundation、Inc.
Geek 14

@Geek-バージョンが古すぎるため、この機能は提供されません。
slm

46

あらゆる出来事^string1^string2bash置き換えるために何かを追加する簡単な方法があるとは思わない。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

うわー、これも本当にすてきです
メイソン14

2

最良の選択肢は「:&」を使用することだと思います

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

3
これは、すべてではない2つのオカレンスを置き換えます(この例では、2つのオカレンスしかありませんが、一般的なケースではありません)。置換するオカレンスの数を追加する必要があります。:&
ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.