Поиск и замена Caret в оболочке Bash
Если я только что ввел следующую команду в Bash:
echo foo
Я могу изменить foo на bar, набрав:
^foo^bar
В результате получается следующая команда:
echo bar
Теперь, если я введу:
echo foo foo
Есть ли способ изменить оба экземпляра foo на bar, просто используя оператор cart (^
)?
Кроме того, существуют ли man-страницы для операторов оболочки, например ^
? man ^
приводит к "Отсутствует ручная запись для ^".
Ответы
Ответ 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