У меня есть файл TXT с математическими уравнениями LaTeX, в которых один разделитель $ используется до и после каждого встроенного уравнения.
Я хотел бы найти каждое из уравнений в абзаце и заменить разделители открывающими и закрывающими тегами XML....
Например.,
Следующий абзац:
This is the beginning of a paragraph $first equation$ ...and here is some text... $second equation$ ...and here is more text... $third equation$ ...and here is yet more text... $fourth equation$
должно стать:
This is the beginning of a paragraph <equation>first equation</equation> ...and here is some text... <equation>second equation</equation> ...and here is more text... <equation>third equation</equation> ...and here is yet more text... <equation>fourth equation</equation>
Я пробовал команды sed и perl, такие как следующие:
perl -p -e 's/(\$)(.*[^\$])(\$)/<equation>$2</equation>/'
Но эти команды приводят к преобразованию первого и последнего экземпляров уравнений, но ни одно из уравнений между этими двумя:
This is the beginning of a paragraph <equation>first equation$ ...and here is some text... $second equation$ ...and here is more text... $third equation$ ...and here is yet more text... $fourth equation</equation>
Я также хотел бы надежное решение, которое могло бы учитывать наличие одного $, который не используется в качестве разделителя LaTeX. Например.,
This is the beginning of a paragraph $first equation$ ...and here is some text that includes a single dollar sign: He paid $2.50 for a pack of cigarettes... $second equation$ ...and here is more text... $third equation$ ...and here is yet more text... $fourth equation$
не становится:
This is the beginning of a paragraph <equation>first equation$ ...and here is some text that includes a single dollar sign: He paid <equation>2.50 for a pack of cigarettes... $second equation$ ...and here is more text... $third equation$ ...and here is yet more text... $fourth equation</equation>
Примечание: я пишу в Bash.
@PedroMaimere Внутри $...$
математического выражения LaTeX могут быть пробелы.
Есть ли что-нибудь, что может вызвать, принадлежат ли знаки доллара (не) к формуле?
К сожалению, нет, не то, что я могу придумать. Иногда есть команды LaTeX (например, \frac) сразу после первого $, но не всегда. Иногда есть только числа, круглые скобки или текст, и все это можно найти после $, который используется для другой цели... Что отличает уравнения LaTeX от других вариантов использования $, так это то, что уравнения всегда заключаются в $, тогда как single $ можно использовать для другой цели. В этом случае трудно исключить ложные срабатывания.
беглый поиск (la) tex, знаков доллара, уравнений ... нашел пару ссылок, которые, возможно, OP может прокомментировать: 1) используйте \(...\)
вместо $...$
для обозначения уравнений, 2) избегайте отдельного $
(т.е. \$
) для его обозначения как буквальное $
; можно ли использовать любой из этих (реалистичных) вариантов, чтобы помочь определить, как следует обрабатывать $
?
Я экспортирую DOCX в Markdown с помощью Pandoc, а встроенный LaTEX всегда имеет разделители $...$
. Я знаю о \(...\)
, но не знаю о фильтре Pandoc, который можно использовать для отображения уравнений таким образом. Да, мы можем избежать отдельного $
, который при экспорте в Markdown будет отображаться как \\\$
ПРИМЕЧАНИЕ. Первая часть этого ответа посвящена исключительно замене пар $'s
; на просьбу ОП не заменять автономный $'s
... см. 2-ю половину ответа.
Замена пар $'s
Образец данных:
$ cat latex.txt
... $first equation$ ... $second equation$ ... $third equation$
Одна sed
идея:
sed -E 's|\$([^$]*)\$|<equation>\1</equation>|g' latex.txt
Где:
-E
- включить расширенную поддержку регулярных выражений\$
- соответствует буквальному $
([^$]*)
- [группа захвата №1] - сопоставить все, что не является литералом $
(в данном случае все, что находится между парой $'s
)\$
- соответствует буквальному $
<equation>\1</equation>
- заменить совпадающую строку на <equation>
+ contents of capture group
+ </equation>
/g
- повторять поиск/замену столько раз, сколько необходимоЭто генерирует:
... <equation>first equation</equation> ... <equation>second equation</equation> ... <equation>third equation</equation>
Работа с автономным $
Если отдельный $
можно экранировать (например, \$
), одна из идей состоит в том, чтобы sed
заменить это бессмысленным литералом, выполнить замену <equation> / </equation>
, а затем изменить бессмысленный литерал обратно на \$
.
Образец данных:
$ cat latex.txt
... $first equation$ ... $second equation$ ... $third equation$
... $first equation$ ... \$3.50 cup of coffee ... $third equation$
Оригинальное решение sed
с новыми заменами:
sed -E 's|\\\$|LITDOL|g;s|\$([^$]*)\$|<equation>\1</equation>|g;s|LITDOL|\\\$|g' latex.txt
Там, где мы заменяем \$
на LITDOL
(буквальные доллары), выполняем нашу первоначальную замену, затем переключаем LITDOL
обратно на \$
.
Что генерирует:
... <equation>first equation</equation> ... <equation>second equation</equation> ... <equation>third equation</equation>
... <equation>first equation</equation> ... \$3.50 cup of coffee ... <equation>third equation</equation>
Спасибо! Я смог подключить строку кода к своему скрипту, и он работает нормально. Я ценю ваше время и усилия.
С sed нормальная «вещь, которая не может существовать на входе» — это \n
, поэтому вы можете использовать ее вместо LITDOL
, чтобы вам не пришлось беспокоиться о ее наличии на входе.
Попробуйте этот Perl, используя отрицательный просмотр вперед.
$ cat joseph.txt
This is the beginning of a paragraph $first equation$ ...and here is some text that includes a single dollar sign: He paid $2.50 for a pack of cigarettes... $second equation$ ...and here is more text... $third equation$ ...and here is yet more text... $fourth equation$
$ perl -p -e 's/(\$)(?![\d.]+)(.+?)(\$)/<equation>$2</equation>/g' joseph.txt
This is the beginning of a paragraph <equation>first equation</equation> ...and here is some text that includes a single dollar sign: He paid $2.50 for a pack of cigarettes... <equation>second equation</equation> ...and here is more text... <equation>third equation</equation> ...and here is yet more text... <equation>fourth equation</equation>
$
Это также уравнение LaTeX $2+a$
что произойдет в приведенном выше коде?
(?![\d.]+)\s
дополнительный пробел будет работать
пространство не имеет значения в уравнениях может быть $ 2 + A + B $
, $2AB$
Я не знаком с LaTeX. Просто пояснение может быть ОП успешно справился с вашим ответом.
@ ssr1012 .. да, верно ... это сложно! .. не знаю, как описывается LateX.
Я не знаком с LaTeX, но я думаю, что внутри формул нет пробелов, верно?