Ряд моих скриптов bash нужно привести в порядок перед отправкой. Я хотел бы использовать фигурные скобки для всех имен переменных. Поэтому везде говорится, что $PWD следует заменить на ${PWD} и так далее.

В качестве теста я использую код

PATH=${PWD}
PATH_PATH=$PATH
PATH_PATH_PATH=$PATH_PATH

Моя идея состояла в том, чтобы использовать поиск и замену регулярных выражений в emacs . Лучшее выражение, которое находит все мои имена переменных (с помощью CTRL-ALT-S) - это $[A-Za-z0-9_\-]* , поэтому последовательность от 'a' до 'z', от 'A' до 'Z ',' 0 'до' 9 ', подчеркивание или дефис после' $ '. Кроме того, он оставляет уже введенные в скобки имена переменных.

Теперь замените:
В руководстве говорится, что replace это 'M-% string RET newstring RET'. На моем компьютере «M-%» - это «ESC-%». Замена регулярного выражения задается как «CM-% regexp RET newstring RET». Я думаю, что это будет C-ESC-% для меня? К сожалению, это также ярлык для монитора «системной активности» в KDE.

У меня осталось 2 вопроса:

  1. Есть ли другой способ вызвать замену регулярного выражения, чем C-ESC-%
  2. для приведенного выше примера, каким должно быть выражение для «newstring»?

1 ответ1

1

Я бы использовал регулярное выражение [$]\([a-zA-Z0-9_-]+\) и строку замены ${\1} . Вот объяснение моих изменений в вашем регулярном выражении:

  • Символ $ совпадает с позицией "конец строки", поэтому вам нужно экранировать его при сопоставлении с литералом $ . Использование [$] вместо \$ - дело вкуса (и оно сокращает обратную косую черту, которую, возможно, придется избежать, если вы хотите перевести это на elisp).

  • Вам не нужно убегать назад - внутри альтернативы персонажу, и вы действительно не можете; в том числе обратная косая черта тоже совпадает с обратной косой чертой. Из руководства:

    Поскольку '\' не является особенным внутри символьной альтернативы, оно никогда не может удалить специальное значение '-' или ']'. Так что не стоит указывать эти символы, когда они не имеют особого значения. Это ничего не прояснит, так как обратная косая черта может законно предшествовать этим символам, если они имеют особое значение, как в '[^\]' ('"[^\\]" для синтаксиса строки Lisp), который соответствует любому одному символу, кроме обратная косая черта.

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

  • Я думаю, что вы не хотите совпадать с одиночным $ , поэтому вы должны использовать + вместо * . Вероятно, не слишком большая сделка, хотя.

  • Наконец, вам нужно заключить имя переменной в \( \) чтобы вы могли ссылаться на него в строке замены (как \1).

Что касается вашего второго вопроса, у вас есть несколько вариантов:

  • Самый простой вариант - ESC C-% . Обратите внимание, что ESC не является ключом-модификатором, это префиксный ключ.

  • Вы можете использовать тот факт, что Emacs интерпретирует ESC и C-[ одинаково и использовать C-[ C-% .

  • Вы можете вызвать команду по имени как M-x query-replace-regexp .

  • Или вы можете привязать команду к более удобной клавише в вашей личной конфигурации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .