^ x ^ y Unix-Trick für alle Instanzen im letzten Befehl?

97

Einer meiner Lieblings-Unix-Tricks ist ^x^y, dass er den letzten Befehl übernimmt und die erste Instanz von "x" durch "y" ersetzt. Ich frage mich jedoch, ob ein ähnlicher Trick funktioniert, um alle Instanzen von "x" durch "y" im letzten Befehl zu ersetzen .

Mason
quelle
2
Diese Funktion wird als Verlaufserweiterung bezeichnet. Sieht so aus, als würden wir das command-historyTag dafür verwenden. Hinzugefügt. Auch nehme ich an, Sie beziehen sich auf die bashShell?
Mikel

Antworten:

107

Sie können die !!:gs/search/replace/Notation verwenden, um das zu tun, was Sie wollen. Dies nutzt das globale Suchen & Ersetzen ( :gs):

Vor

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

nach

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

Verweise

slm
quelle
1
@slm Dieser Befehl ersetzt nur die erste Instanz für mich. [subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat. Was vermisse ich?
Geek
@Geek - was ist deine Distribution? Verwenden Sie Bash? Ausführung? bash --version= 4,2,45 (1) -Freisetzung.
slm
@slm GNU bash, Version 3.2.25 (1) -release (x86_64-RedHat-Linux-Gnu) Copyright (C) 2005 Free Software Foundation, Inc.
Geek
@Geek - eine zu alte Version bietet diese Funktion nicht an.
SLM
46

Ich glaube nicht, dass es eine einfache Möglichkeit gibt, etwas hinzuzufügen ^string1^string2, bashum jedes Vorkommen zu ersetzen. Wie slm betont, muss man schreiben !!:gs/string1/string1.

Aber in zshkönnen Sie nur hinzufügen :G:

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

In beiden bashund zshkönnen Sie auch so verwenden fc -s:

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

Dies wird oft zu einem Alias ​​namens gemacht, rdamit Sie Folgendes tun können:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar
Mikel
quelle
Wow, das ist auch wirklich ordentlich
Mason
2

Ich glaube, dass die beste Option ist, ": &" zu verwenden

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat
Arthur Accioly
quelle
3
Das ersetzt 2 Vorkommen, nicht alle (auch alle in diesem Beispiel, da es nur 2 Vorkommen gibt, aber nicht im allgemeinen Fall). Sie müssten so viele hinzufügen, wie :&weitere Vorkommen zu ersetzen sind.
Stéphane Chazelas