2008-08-26 3 views
4

Есть ли способ запустить замену регулярного выражения в текущей строке в bash?Bash reg-exp substitution

Я нахожусь довольно часто в ситуации, где я набрал длинную командную строку, а затем понимаю, что я хотел бы изменить слово где-то в строке.

Мой текущий подход, чтобы закончить линию, нажмите Ctrl + (чтобы добраться до начала строки), вставьте # (закомментировать строку), нажмите клавишу ВВОД, а затем использовать ^oldword^newword синтаксис (^oldword^newword выполняет предыдущую команду после замены старого слова на новое слово).

Но для достижения этого должен быть лучший (более быстрый) способ. (Мышь невозможна, так как я чаще всего нахожусь в ssh-сессиях).

Возможно, для этого есть некоторая emacs-подобная команда-ключ, о которой я не знаю.

Редактировать: Я попытался использовать vi-mode. Что-то странное произошло. Хотя я любящий vim-пользователь, у меня были серьезные проблемы с использованием моего любимого bash. Все эти движения пальцев, которые были сожжены в моем подсознании, внезапно перестали работать. Я быстро вернулся в emacs-режим и подумал, давая emacs попробовать в качестве моего любимого редактора (хотя, я думаю, это может произойти снова).

ответ

1

К сожалению, нет, нет лучшего способа. Если вы просто устали от нажатия клавиш, вы можете использовать макросы, чтобы обрезать их. Добавьте следующие строки в ~/.inputrc:

"\C-x6": "\C-a#\C-m^" 
"\C-x7": "\C-m\C-P\C-a\C-d\C-m" 

Теперь, в новом экземпляре Баша (или после перезагрузки .inputrc в текущей оболочке, нажав C-x C-r), вы можете сделать следующее:

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

Это не совсем элегантный, но я думаю, что это лучшее, что вы получите с помощью readline.

3

G'day,

Как насчет использования режима vi? Просто введите set -o vi

Тогда вы можете перейти к слову, которое хотите изменить, и просто сделать cw или cW в зависимости от того, что в слове?

К сожалению, забыли добавить, что вы вводите ESC k to o в предыдущую строку в истории команд.

Что вы обычно используете для редактора?

веселит, Роб

Edit: Что я забыл сказать, в моем первоначальном ответе было то, что вы должны думать о командной VI строки в Баш, используя команды, вводимые когда вы находитесь в режиме «экс» в vi, т.е. после того, как вы вошли в двоеточие.

Хуже всего то, что вам нужно перемещаться по истории команд, используя древние команды vi h (слева) и l (справа). Вы можете использовать w (или W), чтобы подпрыгивать через слова.

Как только вы привыкнете к этому, у вас есть всевозможные команды, например. ввод ESC/my_command будет оглядываться назад через вашу историю, в первую очередь, сначала, чтобы найти первое появление командной строки, содержащей текст my_command. Как только он обнаружил это, вы можете использовать n, чтобы найти следующее событие и т. Д. И N, чтобы изменить направление поиска.

Я бы попросил прочитать страницу man для bash, чтобы узнать, что доступно в режиме vi. Как только вы перейдете к тому, что стрелка вверх и стрелка вниз заменяются ESC k, а затем j, вы увидите, что режим vi предлагает больше, чем режим emacs для редактирования командной строки в bash.

IMHO natchurly! (-:

Emacs Восемьдесят мегабайт и постоянная замена!

веселит, Роб

3

в KSH, в режиме VI, если вы нажмете «V» в командном режиме он запускает полную сессию VI на содержание текущей командной строки. Затем вы можете редактировать, используя полный набор команд vi (глобальный поиск и замена в вашем случае). Когда: wq из vi, отредактированная команда выполняется. Я уверен, что нечто подобное существует для bash. Поскольку bash имеет тенденцию расширять свои предшественники, возможно, что-то подобное.

+0

Это действительно работает с Bash, и я бы сказал, что это лучший ответ, когда вы хотите сделать полномасштабный «материал редакции» вашей текущей командной строкой. – jwd 2016-08-17 21:46:12