Вопрос
Есть ли способ запустить замену строки регулярного выражения в текущей строке в bash?
Я довольно часто оказываюсь в ситуации, когда я набрал длинную командную строку, а затем понимаю, что хочу изменить слово где-то в строке.
Мой текущий подход - закончить строку, нажать Ctrl+А (чтобы перейти к началу строки), вставьте # (чтобы закомментировать строку), нажмите Enter, а затем используйте ^oldword^newword
синтаксис (^oldword^newword
выполняет предыдущую команду после замены старого слова на новое).
Но должен быть лучший (более быстрый) способ добиться этого.(Мышь невозможна, так как большую часть времени я нахожусь в ssh-сессиях).
Вероятно, для этого есть какая-то клавишная команда, похожая на emacs, о которой я не знаю.
Редактировать:Я пробовал использовать vi-mode.Произошло что-то странное.Хотя я любящий пользователь vim, у меня были серьезные проблемы с использованием моего любимого bash.Все те движения пальцев, которые въелись в мое подсознание, внезапно перестали работать.Я быстро вернулся в режим emacs и задумался о том, чтобы попробовать emacs как мой любимый редактор (хотя я предполагаю, что то же самое может случиться снова).
Решение
К сожалению, нет, лучшего способа не существует.Если вам просто надоело нажимать клавиши, вы можете использовать макросы, чтобы сократить их.Добавьте следующее в свой ~/.inputrc
:
"\C-x6": "\C-a#\C-m^"
"\C-x7": "\C-m\C-P\C-a\C-d\C-m"
Теперь в новом экземпляре bash (или после перезагрузки .inputrc
в вашей текущей оболочке, нажав C-x C-r
), вы можете сделать следующее:
- Введите фиктивную команду (например,
ls abcxyz
). - Нажмите Ctrl-x, затем 6.Макрос вставляет
#
в начале строки, выполняет закомментированную строку и вводит свой первый^
. - Введите исправление (например,
xyz^def
). - Нажмите Ctrl-x, затем 7.Макрос завершает вашу замену, затем переходит к предыдущей (закомментированной) строке, удаляет символ комментария и выполняет ее снова.
Это не совсем элегантно, но я думаю, что это лучшее, что вы можете получить с помощью readline.
Другие советы
в ksh, в режиме vi, если вы нажмете «v» в командном режиме, это создаст полный сеанс vi с содержимым вашей текущей командной строки.Затем вы можете редактировать, используя полный набор команд vi (в вашем случае глобальный поиск и замена).Когда :wq из vi, выполняется отредактированная команда.Я уверен, что что-то подобное существует для bash.Поскольку bash имеет тенденцию расширять своих предшественников, вероятно, существует что-то подобное.
Добрый день,
А как насчет использования вместо этого режима vi?Просто введите set -o vi
Затем вы можете перейти к слову, которое хотите изменить, и просто нажать cw или cW в зависимости от того, что в этом слове?
К сожалению, забыл добавить, что вы вводите ESC k to o в предыдущую строку в истории команд.
Что вы обычно используете в качестве редактора?
Ура, Роб
Редактировать:Что я забыл сказать в своем первоначальном ответе, так это то, что вам нужно думать о командной строке vi в bash, используя команды, которые вы вводите, когда вы находитесь в режиме «ex» в vi, т.е.после того, как вы вошли в толстую кишку.
Хуже всего то, что вам нужно перемещаться по истории команд, используя древние команды vi: h (влево) и l (вправо).Однако вы можете использовать w (или W), чтобы перемещаться по словам.
Однако, как только вы к этому привыкнете, вам станут доступны все виды команд, например.ввод ESC / my_command просмотрит вашу историю, сначала самую последнюю, чтобы найти первое вхождение командной строки, содержащей текст my_command.Как только он это обнаружит, вы можете использовать n, чтобы найти следующее вхождение и т. д.И N, чтобы изменить направление поиска.
Я бы прочитал справочную страницу bash, чтобы посмотреть, что доступно в режиме vi.Как только вы поймете, что стрелки вверх и вниз заменяются на ESC k, а затем j, вы увидите, что режим vi предлагает больше, чем режим emacs, для редактирования командной строки в bash.
ИМХО естественно!(-:
Эмакс?Восемьдесят мегабайт и постоянно подкачка!
Ура, Роб