^ 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 .


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


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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.