Вопрос

Есть ли способ запустить замену строки регулярного выражения в текущей строке в 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), вы можете сделать следующее:

  1. Введите фиктивную команду (например, ls abcxyz).
  2. Нажмите Ctrl-x, затем 6.Макрос вставляет # в начале строки, выполняет закомментированную строку и вводит свой первый ^.
  3. Введите исправление (например, xyz^def).
  4. Нажмите 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.

ИМХО естественно!(-:

Эмакс?Восемьдесят мегабайт и постоянно подкачка!

Ура, Роб

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top