^ x ^ y trik unix untuk semua instance dalam perintah terakhir?

97

Salah satu trik Unix favorit saya adalah ^x^y, yang akan mengambil perintah terakhir dan mengganti instance pertama dari "x" dengan "y". Namun, saya bertanya-tanya apakah trik yang sama berfungsi untuk mengganti semua contoh "x" dengan "y" pada perintah terakhir?

Tukang batu
sumber
2
Fitur ini disebut ekspansi sejarah. Sepertinya kami menggunakan command-historytag untuk itu. Ditambahkan. Juga, saya menganggap Anda mengacu pada bashshell?
Mikel

Jawaban:

107

Anda dapat menggunakan !!:gs/search/replace/notasi untuk melakukan apa yang Anda inginkan. Ini menggunakan pencarian global & ganti ( :gs):

sebelum

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

setelah

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

Referensi

slm
sumber
1
@slm perintah ini hanya menggantikan contoh pertama untuk saya. [subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat. Apa yang saya lewatkan?
Geek
@ Geek - apa distro Anda? Apakah Anda menggunakan Bash? Versi? bash --version= 4.2.45 (1) -lepas.
slm
@slm GNU bash, versi 3.2.25 (1) -release (x86_64-redhat-linux-gnu) Hak Cipta (C) 2005 Free Software Foundation, Inc.
Geek
@Geek - versi yang terlalu lama, tidak menawarkan fitur ini.
slm
46

Saya tidak percaya ada cara mudah untuk menambahkan sesuatu untuk ^string1^string2membuat bashmenggantikan setiap terjadinya. Seperti yang ditunjukkan oleh slm, Anda harus menulis !!:gs/string1/string1.

Namun zsh, Anda dapat menambahkan :G:

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

Dalam keduanya bashdan zsh, Anda juga dapat menggunakan fc -sseperti ini:

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

Ini sering dibuat menjadi alias yang disebut rsehingga Anda bisa melakukan:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar
Mikel
sumber
Wow, ini juga sangat rapi
Mason
2

Saya percaya bahwa opsi terbaik adalah menggunakan ": &"

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat
Arthur Accioly
sumber
3
Itu menggantikan 2 kejadian, tidak semuanya (yah semuanya dalam contoh ini karena hanya ada 2 kejadian, tetapi tidak dalam kasus umum). Anda harus menambahkan sebanyak mungkin :&ada lebih banyak kejadian yang harus diganti.
Stéphane Chazelas