2012-04-09 5 views
4

Все в названии. У меня есть много файлов LaTeX, написанных с довольно устаревшим синтаксисом $foo$ и $$bar$$, которые я хочу конвертировать соответственно в \\(foo\\) и \\[bar\\]. Я использую vim, поэтому я предполагаю, что регулярное выражение будет выполнено, но скрипт также будет отлично. Я смотрю вокруг, но безуспешно.

Edit: Следующий полезный ответ kirilloid, я хотел бы упомянуть, я хотел бы использовать это также в случае foo и bar не только слова, но выражения, содержащие пробелы (но не $ s очевидно).

+0

следующий полезный ответ на kirilloid, я хочу упомянуть, что я хотел бы использовать это также в случае, если foo и bar - это не только слова, но и выражения, содержащие пробелы (но, очевидно, не $). – Niels

ответ

4

Использование

:%s/\V$$\v(\_.{-})\V$$/\\[\1\\]/g 
:%s/\v\$([^$]+)\$/\\(\1\\)/g 

Отличия от @kirilloid ответа являются следующие:

  1. Использование очень магии (\v, отключает нужно избежать большинства мета-символы) и очень номагические (все, кроме обратной косой черты имеют свои буквальные значения) режимы f или читаемость
  2. Способность справляться с многострочно $$ строки (\_ добавляет новую строку ., \_. единственная конструкция, которая на самом деле означает любой символ, . не включает в себя символ новой строки). {-} (\{-} в магических, номагических и очень номагических режимах) - это не жадный вариант *.
  3. Может быть любой символ между этими строками ($: любой, кроме символа новой строки), но для этого вам необходимо убедиться, что $$ всегда начинает контурную формулу, а $ всегда начинает встроенный. Вы можете ограничить замену строками, где это верно, либо заменив % перед командой с {first_line_number},{last_line_number}, либо выбрав их визуально, набрав : (появится в начале командной строки) и перейдя к типу s/... команды без ввода :%.
+0

спасибо, это уже очень полезно. Я попытался использовать большой файл, и вторая формула, похоже, испортила ситуацию, когда новая строка появляется между двумя долларами (я имею в виду внутри встроенной формулы). Что делать, если я хочу принять любого персонажа, включая новую строку? – Niels

+1

@Niels Добавьте '\ _' перед коллекцией. '\ _' работает для точек, коллекций и классов символов (в последнем случае' \ _ \ x' можно свести к '\ _x'), добавив новую строку в список совпадающих элементов. Примечание: '\ n' в коллекциях работает одинаково, поэтому' [^ $ \ n] 'будет соответствовать чему угодно, кроме доллара.* Anything *, включая newline, поэтому я предлагаю никогда не использовать его: если вы переключитесь на perl-подобные регулярные выражения (присутствующие на большинстве других языков), вы увидите, что '[^ $ \ n]' будет соответствовать чему угодно, кроме доллара и новой строки. – ZyX

+0

Большое спасибо за объяснения. – Niels

4

Все должно быть эвакуировано: $ уже является метасимволом и должен быть экранирован. ()+ следует сбежать на работу, поскольку они обычно работают в регулярных выражениях.

:%s/\$\$\(\w\+\)\$\$/\\[\1\\]/g 
:%s/\$\(\w\+\)\$/\\(\1\\)/g 

http://vim.wikia.com/wiki/Search_and_replace

+0

спасибо, будет ли это работать, если между двумя $ 's (соответственно $$'?) Существует более одного слова? – Niels

+0

нет, причина \ w есть '[a-zA-Z0-9_]', то есть не включать пространство. Чтобы совместить пробелы, вам нужно использовать что-то вроде '\ (\ [a-zA-Z_ \ s \] \ + \? \)'. Я не уверен, однако, работает ли негласный локальный модификатор в 'vim'. – kirilloid

Смежные вопросы