^ x ^ y фокус Unix для всіх екземплярів останньої команди?


97

Один з моїх улюблених трюків Unix - це те ^x^y, що візьме останню команду і замінить перший екземпляр "x" на "y". Однак мені цікаво, чи працює подібний трюк, щоб замінити всі екземпляри "x" на "y" в останній команді?


2
Особливість називається розширенням історії. Схоже, ми використовуємо для цього command-historyтег. Додано. Також я припускаю, що ви маєте на увазі bashоболонку?
Мікель

Відповіді:


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. Що я пропускаю?
Geek

@Geek - який у тебе дистрибутив? Ви використовуєте Bash? Версія? bash --version= 4.2.45 (1) -випуск.
slm

@slm GNU bash, версія 3.2.25 (1) -випуск (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Free Foundation Foundation, Inc.
Geek

@Geek - занадто стара версія, ця функція не пропонує.
slm

45

Я не вірю , що є простий спосіб додати що - то , ^string1^string2щоб зробити bashзаміну всіх входжень. Як вказує slm, ви повинні писати !!:gs/string1/string1.

Але в zsh, ви можете просто додати :G:

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

І в обох, bashі zshви також можете використовувати 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

Ого, це теж дуже акуратно
Мейсон

2

Я вважаю, що найкращим варіантом є використання ": &"

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

3
Це замінює 2 події, не всі з них (ну і все в цьому прикладі, оскільки є лише 2 випадки, але не в загальному випадку). Вам потрібно буде додати стільки, :&скільки є більше випадків для заміни.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.