^ x ^ y Unix трюк для всех экземпляров в последней команде?


97

Один из моих любимых трюков с Unix - ^x^yвзять последнюю команду и заменить первый экземпляр «x» на «y». Однако мне интересно, работает ли подобный трюк, чтобы заменить все вхождения «x» на «y» в последней команде?


2
Эта функция называется расширением истории. Похоже, мы используем command-historyтег для этого. Добавлен. Кроме того, я полагаю, вы имеете в виду bashоболочку?
Микель

Ответы:


107

Вы можете использовать !!:gs/search/replace/обозначение, чтобы делать то, что вы хотите. Это использует глобальный поиск & 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, Что мне не хватает?
Компьютерщик

@ Гик - какой у тебя дистрибутив? Вы используете Bash? Версия? bash --version= 4.2.45 (1) -релиз.
SLM

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

@Geek - слишком старая версия, не предлагает эту функцию.
SLM

46

Я не верю , что есть простой способ добавить что - то , ^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.