Замена Bash-рег-эксп - PullRequest
       31

Замена Bash-рег-эксп

4 голосов
/ 26 августа 2008

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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 26 августа 2008

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

3 голосов
/ 26 августа 2008

G'day,

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

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

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

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

веселит, Rob

Редактировать: Я забыл сказать в своем первоначальном ответе, что вам нужно думать о командной строке vi в bash, используя команды, которые вы вводите, когда находитесь в режиме «ex» в vi, т.е. толстой кишки.

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

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

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

ИМХО натчурлы! (-:

Emacs? Восемьдесят мег и постоянно меняются местами!

веселит, Rob

1 голос
/ 22 сентября 2008

К сожалению, нет, лучшего способа нет. Если вы просто устали от нажатия клавиш, вы можете использовать макросы, чтобы обрезать их. Добавьте следующее к вашему ~/.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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...