Используйте оператор диапазона (..
) в скалярном контексте, то есть как триггер, чтобы изолировать блоки, над которыми вы хотите работать.
#!/usr/bin/perl
use strict;
use warnings;
while (<STDIN>) {
if (/^\\begin\{align\}/../^\\end\{align\}/) {
# replace all occurences of "(" with "\left("
s/\(/\\left(/g;
}
print;
}
exit 0;
Тестовый запуск с заданным вами текстом:
$ perl dummy.pl <dummy.txt
Lorem Ipsum Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum (Lorem Ipsum Lorem Ipsum )
Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum
\begin{align}
\frac{d_l}{2}< |\epsilon_H\left(g\left(m))| <\frac{d_r}{2}
\frac{d_l}{2}< |\epsilon_H\left(g\left(m))| <\frac{d_r}{2}
\end{align}
Lorem Ipsum Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum Lorem Ipsum
Или в виде однострочного:
$ perl <dummy.txt -pe 's/\(/\\left(/g if (/^\\begin\{align\}/../^\\end\{align\}/)'
...
\frac{d_l}{2}< |\epsilon_H\left(g\left(m))| <\frac{d_r}{2}
\frac{d_l}{2}< |\epsilon_H\left(g\left(m))| <\frac{d_r}{2}
...
Если обнаружение блока слишком строго, т. Е. В вашем реальном документе \begin
и \end
не находятся в началезатем введите следующую строку без ^
(каретка):
if (/\\begin\{align\}/../\\end\{align\}/) {