Подтвердить что ты не робот

Поиск и замена Caret в оболочке Bash

Если я только что ввел следующую команду в Bash:

echo foo

Я могу изменить foo на bar, набрав:

^foo^bar

В результате получается следующая команда:

echo bar

Теперь, если я введу:

echo foo foo

Есть ли способ изменить оба экземпляра foo на bar, просто используя оператор cart (^)?

Кроме того, существуют ли man-страницы для операторов оболочки, например ^? man ^ приводит к "Отсутствует ручная запись для ^".

4b9b3361

Ответ 1

Эта особенность называется быстрой заменой; его документацию можно найти в разделе Обозреватели событий в руководстве Bash. Вы не можете делать то, что хотите, с быстрой заменой; вам придётся прибегнуть к чему-то немного более подробному:

!!:gs/foo/bar/

Ответ 2

Не уверен, как это сделать с замещением каретки, но вот как вы это делаете с историей:

!!:gs/foo/bar/

Позвольте мне сломать это:

!! - повторяет последнюю команду. Вы также можете использовать! -2 для запуска двух команд назад,! Echo для запуска последней команды, которая начинается с echo

: gs говорит, что нужно выполнить глобальный (все экземпляры) поиск/замену. Если вы хотите просто заменить первый экземпляр, вы должны использовать ': s'

Наконец,/foo/bar/говорит, чтобы заменить foo на bar

Ответ 3

Try:

^foo^bar^:&

Как вы знаете, ^foo^bar^ выполняет только одну замену, а модификатор :& повторяет его.

Ответ 4

Подстановка Caret и другие подобные ярлыки находятся в подразделе Event Designators раздела ИСТОРИЯ EXPANSION на странице руководства bash(1).

Ответ 5

^word^  ........... erase word
^word^^ ........... delete everything until the end of the line

Ответ 6

Если вы ищете что-то менее сложное для запоминания, которое выполняет то же самое, что и предыдущее !!:gs/foo/bar/, вы всегда можете создать функцию в своем запуске .bash_profile script. Я выбрал replace().

replace() {
    eval $(echo $(fc -ln -1) | eval "sed 's/${1}/${2}/g'") #compact form
}

ИЛИ, менее свернуто

replace() {
    string=$(fc -ln -1) #gets last command string
    repcmmd="sed 's/${1}/${2}/g'" #build replacement sed command from fn input
    eval $(echo $string | eval $repcmmd) #evaluates the replacement command
}

Затем заменить все можно с помощью

echo foo foo
replace foo bar