找到完全匹配并使用前后

时间:2017-06-28 07:46:15

标签: perl

找到确切的[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]对,并将其更改为equation (begin and end),其中找到了align (begin and end)代码。

我的数据

<check>

我的代码

my $str = '
\begin{equation}
v_{i}(t)=M\xi_{l}^{-1}(\Vert z^{0}\Vert_{\infty}+\varepsilon)\xi_{i}e^{\gamma t},\quad t\geq 0.\label{eq:2.3}
\end{equation}


\begin{equation}
v_{\kappa}(q_{\kappa j}t)=M\xi_{l}^{-1}(\Vert z^{0}\Vert_{\infty}+\varepsilon)\xi_{\kappa}e^{\gamma q_{\kappa j}t}= v_{\kappa}(t)e^{-\gamma (1-q_{\kappa j})t}\leq v_{\kappa}(t).\label{eq:2.4}
<check>
\end{equation}


\begin{equation}
|z_{i}(0)|\lt\xi_{l}^{-1}(\Vert z^{0}\Vert_{\infty}+\varepsilon)\xi_{i} \leq M\xi_{l}^{-1}(\Vert z^{0}\Vert_{\infty}+\varepsilon)\xi_{i}= v_{i}(0), i\in J.\label{eq:2.5}
<check>
\end{equation}


\begin{equation}
|z_{i}(t) | \lt v_{i}(t)\quad \mbox{for all } t \in (0, T],\  i\in J.\label{eq:2.6}
\end{equation}';

我的检查方法是找到while( $str =~ m/\\begin\{((?:[^{}]*)\*?)\}((?:(?!\\end\{\1\}).)*)<check>((?:(?!\\end\{\1\}).)*)\\end\{\1\}/sgi ) { print "Found: $&\n"; } \begin{},找到\end{}元素, 然后将<check>更改为equation。如果方程式超过1000,则该工具消耗太多时间来检查每个方程。因此需要检查另一种方式。

我可以这样做吗?

  • 直接找到align元素
  • 转到<check>之前
  • 将其更改为\begin{equation}
  • 查找结束\begin{align}
  • 将其更改为\end{equation}

我认为有可能。

1 个答案:

答案 0 :(得分:2)

到目前为止最简单的方法是将整个文件放入并找到整个方程式

perl -0777 -wpe'
    s[ \\begin{equation} (.*? <check> .*?) \\end{equation} ]
     [ \\begin{align} $1 \\end{align} ]gsx
' file.tex  > changed_file.tex

当匹配失败时,不进行替换,因此无需先找到匹配项。使用-p当前“行”($_,此处的整个文件)将被打印,更改或不更改,因此我们处理整个文件。

.*?与第一个<check>匹配,然后第二个.*?匹配从第一个\end{equation}开始。那里可能有更多<check>个标签,但这与我们无关,因为它们无需识别。只要等式中有任何一个,就可以进行替换。

Latex/Tex文档不太可能太大而无法立即处理。

另一种方法是将标记保留在感兴趣的元素上,一旦检测到<check>标记,就更改它们。您可以在阅读时使用文件行填充单独的数组,以避免在文件中来回seek并更改其元素。最后输出该数组作为已处理文件。