Поиск совпадающих строк в абзацах

У меня есть файл 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.

Я не знаком с LaTeX, но я думаю, что внутри формул нет пробелов, верно?

Pedro Maimere 21.12.2020 02:53

@PedroMaimere Внутри $...$ математического выражения LaTeX могут быть пробелы.

Joseph Polizzotto 21.12.2020 02:57

Есть ли что-нибудь, что может вызвать, принадлежат ли знаки доллара (не) к формуле?

Pedro Maimere 21.12.2020 03:08

К сожалению, нет, не то, что я могу придумать. Иногда есть команды LaTeX (например, \frac) сразу после первого $, но не всегда. Иногда есть только числа, круглые скобки или текст, и все это можно найти после $, который используется для другой цели... Что отличает уравнения LaTeX от других вариантов использования $, так это то, что уравнения всегда заключаются в $, тогда как single $ можно использовать для другой цели. В этом случае трудно исключить ложные срабатывания.

Joseph Polizzotto 21.12.2020 03:14

беглый поиск (la) tex, знаков доллара, уравнений ... нашел пару ссылок, которые, возможно, OP может прокомментировать: 1) используйте \(...\) вместо $...$ для обозначения уравнений, 2) избегайте отдельного $ (т.е. \$) для его обозначения как буквальное $; можно ли использовать любой из этих (реалистичных) вариантов, чтобы помочь определить, как следует обрабатывать $?

markp-fuso 21.12.2020 03:52

Я экспортирую DOCX в Markdown с помощью Pandoc, а встроенный LaTEX всегда имеет разделители $...$. Я знаю о \(...\), но не знаю о фильтре Pandoc, который можно использовать для отображения уравнений таким образом. Да, мы можем избежать отдельного $, который при экспорте в Markdown будет отображаться как \\\$

Joseph Polizzotto 21.12.2020 04:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
111
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

ПРИМЕЧАНИЕ. Первая часть этого ответа посвящена исключительно замене пар $'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>

Спасибо! Я смог подключить строку кода к своему скрипту, и он работает нормально. Я ценю ваше время и усилия.

Joseph Polizzotto 21.12.2020 04:38

С sed нормальная «вещь, которая не может существовать на входе» — это \n, поэтому вы можете использовать ее вместо LITDOL, чтобы вам не пришлось беспокоиться о ее наличии на входе.

Ed Morton 21.12.2020 05:10

Попробуйте этот 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$ что произойдет в приведенном выше коде?

ssr1012 21.12.2020 04:12
(?![\d.]+)\s дополнительный пробел будет работать
stack0114106 21.12.2020 04:28

пространство не имеет значения в уравнениях может быть $ 2 + A + B $, $2AB$ Я не знаком с LaTeX. Просто пояснение может быть ОП успешно справился с вашим ответом.

ssr1012 21.12.2020 04:30

@ ssr1012 .. да, верно ... это сложно! .. не знаю, как описывается LateX.

stack0114106 21.12.2020 05:01

Другие вопросы по теме