Добавление круглых скобок вокруг всех чисел уравнения с помощью sed - PullRequest
0 голосов
/ 12 июня 2018

У меня есть большой файл LaTeX, содержащий огромное количество уравнений.На них все ссылаются следующим образом:

Equation~\ref{XX}
Equation~\ref{XY}
...

Я хочу получить это,

Equation~(\ref{XX})
Equation~(\ref{XY})
...

У меня есть только базовые знания о sed, но я убежден, что это может сработатьиспользуя символ '&'.

Я пытался:

sed 's#\ref{*}#(&)#g' input_tex_file.tex

Что ничего не меняет.

Если я делаю:

sed 's#\ref{XX}#(&)#g' input_tex_file.tex

Я, очевидно, получаю

Equation~(\ref{XX})

Но я бы хотел избежать написания скрипта для обнаружения всех ссылок и их последовательного изменения, даже если я предполагаю, что это не будет подавляющим.

Обратите также внимание, чтоУ меня есть куча таких вещей, как Таблица ~ \ ref {XX} и Рисунок ~ \ ref {XX} , которые я хотел бы оставить без изменений.

Есть идеи?

1 Ответ

0 голосов
/ 12 июня 2018

Символ & в шаблоне замены обозначает весь матч.Вы, кажется, хотите избежать изменения значений после любого слова, кроме Equation~, поэтому его следует включить в шаблон, а это означает, что вы не можете использовать &, но обычные \1 и \2 для ссылки на захваченные частирегулярное выражение

Вы можете захватить Equation~ и остальную часть шаблона в две отдельные группы и обратиться к ним при замене:

sed 's#\(Equation~\)\(\\ref{[^{}]*}\)#\1(\2)#g'

или, с помощью POSIX ERE,

sed -E 's#(Equation~)(\\ref\{[^{}]*})#\1(\2)#g'

Демо :

s='Equation~\ref{XX} Table~\ref{XX} and Figure~\ref{XX}'
echo "$s" | sed 's#\(Equation~\)\(\\ref{[^{}]*}\)#\1(\2)#g'
# => Equation~(\ref{XX}) Table~\ref{XX} and Figure~\ref{XX}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...