^ x ^ y trucco unix per tutte le istanze nell'ultimo comando?


97

Uno dei miei trucchi Unix preferiti è ^x^y, che prenderà l'ultimo comando e sostituirà la prima istanza di "x" con "y". Tuttavia, mi chiedo se un trucco simile funzioni per sostituire tutte le istanze di "x" con "y" nell'ultimo comando?


2
La funzione si chiama espansione della cronologia. Sembra che usiamo il command-historytag per questo. Aggiunto. Inoltre, suppongo che ti riferisci alla bashshell?
Mikel,

Risposte:


107

Puoi usare la !!:gs/search/replace/notazione per fare quello che vuoi. Questo utilizza la ricerca globale e sostituisci ( :gs):

prima

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

dopo

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

Riferimenti


1
@slm questo comando sta sostituendo solo la prima istanza per me. [subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat. Cosa mi sto perdendo?
Geek,

@Geek - qual è la tua distribuzione? Stai usando Bash? Versione? bash --version= 4.2.45 (1)-release.
slm

@slm GNU bash, versione 3.2.25 (1) -release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc.
Geek

@Geek - una versione troppo vecchia, non offre questa funzione.
slm

46

Non credo ci sia un modo semplice per aggiungere qualcosa ^string1^string2per rendere bashsostituire ogni occorrenza. Come sottolinea slm, devi scrivere !!:gs/string1/string1.

Ma in zsh, puoi semplicemente aggiungere :G:

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

In entrambi bashe zsh, puoi anche usare in fc -squesto modo:

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

Questo è spesso trasformato in un alias chiamato in rmodo da poter semplicemente fare:

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

Wow, anche questo è davvero pulito
Mason,

2

Credo che l'opzione migliore sia usare ": &"

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

3
Ciò sostituisce 2 occorrenze, non tutte (bene tutte in questo esempio in quanto vi sono solo 2 occorrenze, ma non nel caso generale). Dovresti aggiungere quante :&più occorrenze da sostituire.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.