
Я знаю, 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'
Заставляет -z
GNU sed
поглощать весь ввод как одну строку. Это расширение стандартной sed
функциональности.
решение2
Замените каждый $
символ, которому непосредственно предшествует граница слова, на \(
, а каждый $
символ, которому непосредственно предшествует граница слова, на \)
:
sed -e 's/\$\</\\(/g' -e 's/\>\$/\\)/g' file
sed
Пользователи GNU могут использовать \<
и \>
для границ слов, но также могут использовать \b
вместо этого. Пользователи BSD могут использовать \<
и , \>
как показано, но смогут использовать [[:<:]]
и [[:>:]]
, если захотят (пользователи macOS с ихпо умолчанию sed
придется использовать [[:<:]]
и [[:>:]]
).