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)