Заменить четные и нечетные повторения строки другими строками

Заменить четные и нечетные повторения строки другими строками

Я знаю, sedчто есть способ сделать это, но я не могу заставить его работать. У меня есть файл Latex, который содержит математические выражения, выделенные $. Я хотел бы преобразовать это в код MathJax. Для этого просто требуется $заменить нечетные экземпляры a на \(, а четные экземпляры $на \). Так что

Here is Einstein's equation $E=mc^2$ and here is Newton's law $F=ma$

должно стать

Here is Einstein's equation \(E=mc^2\) and here is Newton's law \(F=ma\)

Обратите внимание, что последовательные вхождения $находятся на одной строке, но строк может быть больше одной. Я хочу, чтобы замена произошла по всему файлу. Любая помощь будет высоко оценена.

решение1

Используйте GNU sed:

sed -Ez 's/\$([^$]*)\$/\\(\1\\)/g'

То же самое без -E:

sed -z 's/\$\([^$]*\)\$/\\(\1\\)/g'

Заставляет -zGNU sedпоглощать весь ввод как одну строку. Это расширение стандартной sedфункциональности.

решение2

Замените каждый $символ, которому непосредственно предшествует граница слова, на \(, а каждый $символ, которому непосредственно предшествует граница слова, на \):

sed -e 's/\$\</\\(/g' -e 's/\>\$/\\)/g' file

sedПользователи GNU могут использовать \<и \>для границ слов, но также могут использовать \bвместо этого. Пользователи BSD могут использовать \<и , \>как показано, но смогут использовать [[:<:]]и [[:>:]], если захотят (пользователи macOS с ихпо умолчанию sedпридется использовать [[:<:]]и [[:>:]]).

Связанный контент