У меня есть файл Rmarkdown, и я хочу перевести его в медиа-файл wiki, потому что это разные языки разметки, у них другой синтаксис, и я хочу найти способ изменить их все с помощью команды substitute.

Вот два варианта использования:

  1. Измените заголовки # title, ## subtitle и т.п. на =title= и ==subtitle==,
  2. Измените окружение $inline formula$, $$standalone formula $$ и т.п. на <math>inline formula</math> и :<math>standalone formula</math>.

Они отличаются тем, что первый я хочу сопоставить начало фразы, а затем окружить его некоторыми другими символами, а второй меняет один тип окружения на другой. Я не хочу записывать какие-то макросы, потому что фразы могут быть очень разными, а их много. Я пробовал некоторые команды, такие как %s/=*/*/gc или %s/$*$/<math>*</math>/gc, но они не работали, поэтому я думаю, что, возможно, испортил регулярные выражения (мои знания о регулярных выражениях весьма ограничены, и я не уверен, какой из символы должны быть экранированы в Vim).

0
Olivier Ma 28 Май 2018 в 18:47

1 ответ

Лучший ответ

В каждом диалекте регулярных выражений * является жадным квантификатором, который означает «0 или более предшествующих атомов, как можно больше», тогда как при использовании в качестве глобуса он означает «любой символ» (в вашей оболочке для пример).

Поскольку замены в Vim используют регулярные выражения, а не глобусы, должно быть очевидно, почему :%s/=*/*/gc и %s/$*$/<math>*</math>/gc не делают ничего полезного.

Еще одна проблема с вашими попытками заключается в том, что вы каким-то образом ожидаете, что обработчик регулярных выражений угадывает, какую часть совпадения повторно использовать в замене. Это делается путем повторного использования «подвыражений», иногда называемых «группами захвата».

См. :help \(, :help \1 и http://vimregex.com/.

  1. Измените заголовки #title, ##subtitle и т.п. на =title= и ==subtitle==,
:%s/^\(#\+\)\(.*\)/\=repeat('=',len(submatch(1))).submatch(2).repeat('=',len(submatch(1)))

Обратите внимание, что заголовки уценки имеют неправильный формат.

1
romainl 28 Май 2018 в 17:40