Сведения о вопросе

Martincow

21:29, 5th August, 2020

Теги

regex   bash    

Bash Рег-эксп замена

Просмотров: 447   Ответов: 3

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

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

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

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

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

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



  Сведения об ответе

COOL

17:34, 14th August, 2020

Добрый день,

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

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

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

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

овации, Грабить

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

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

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

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

IMHO натчерли! (-:

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

овации, Грабить


  Сведения об ответе

PAGE

07:33, 23rd August, 2020

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


  Сведения об ответе

+-*/

07:10, 6th August, 2020

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

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться