Emacs: как заменить строку, используя регулярное выражение?

Предположим, что в текстовом файле (или в буфере), открытом в emacs, есть следующее: file_01.txt file_02.txt ... file_99.txt

Я хочу выполнить запрос - замените или замените файлы на 01_file.txt и т.д.

Я хочу использовать query-replace-regexp или replace-regexp, но не знаю, что положить. Часть поиска я вставляю в "file_..", но ".." читаются как периоды в заменяющая строка. Я начинаю изучать regexp и не знаю, как это сделать. Пожалуйста, помогите, спасибо.

Ответ 1

M-x replace-regexp вызывает функцию для замены регулярными выражениями.

Для Rege regexp введите: \(file\)_\([0-9]+\)

Это создаст две группы: одну, которая соответствует части файла, и номер, соответствующий номеру. Скобки \( ... \) необходимы, чтобы совпадение доступно позже в заменяющей строке.

Заменить с enter: \2_\1

Вставляет второе совпадение из строки поиска (числовая часть), добавляет _ (подчеркивание), а затем добавляет первое соответствие из строки поиска ( "файл" ).

Дополнительные сведения о регулярных выражениях Emacs см. в Синтаксис Regexp и Regexp Replace.

Как только вы освоите основы регулярного выражения, вы можете проверить инструмент Emacs ReBuilder с M-x re-builder, который позволяет вам создавать regexes интерактивно.

Ответ 2

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

У меня есть буфер с file_01.txt file_02.txt file ...

С re-builder выражение \(file\)_\([0-9]+\) не работает, но необходимо удвоить escape-последовательности, такие как \\(file\\)_\\([0-9]+\\).

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

Следующие команды

M-x replace-regexp \(file\)_\([0-9]+\) или \\(file\\)_\\([0-9]+\\)

заменен на

\2_\1 или \\2_\\1

всегда приводит к Replaced 0 occurences. То есть, независимо от того, существует ли \ перед круглыми круглыми скобками один или два раза.

Ясно, что я здесь что-то явно не вижу. Не могли бы вы объяснить?

Я нахожусь в GNU Emacs 24.3.1 (x86_64-pc-linux-gnu, GTK + Version 3.10.7)