我需要在vim正则表达式的帮助下,在一个大的Latex文档中更改数学变量的名称,我正在努力学习。
例如,我想将标记为't'的变量更改为's',例如
\begin{equation}
f(X) \leq \sqrt{t(t+1)}
\end{equation}
应该变成
\begin{equation}
f(X) \leq \sqrt{s(s+1)}
\end{equation}
为此,我需要在\begin{equation}
和匹配的\end{equation}
之间的某个地方搜索字符't',可能有几行换行符,但字符't'不应该是任何关键字的一部分例如\sqrt
我试过了
%s/\\begin{equation}\_.\{-}\(\\\a*\)\@!\zst\ze\_.\{-}\\end{equation}/s/g
但它不能正常工作。此外,这种模式甚至匹配像\sqrt
这样的关键字,我不明白为什么。但是,我我意识到,正如我所做的那样将两个\_.\{-}
之间的匹配夹在中间,不会产生预期的结果,因为它不会匹配字符't'的多次出现
如果可能,我更喜欢纯vim正则表达式解决方案。
注意:
由于我使用equation
以外的其他环境,例如align
,eqnarray
,multline
等,因此在模式中插入OR会更好比如
/\\begin{\(equation\|align\|eqnarray\|multline\)}
然后找到匹配的\end{…}
。你是如何做到的?
答案 0 :(得分:0)
您只需将t作为整个单词匹配。要实现这一点,首先应该更改为正则表达式是添加单词start和en boundary \<
和\>
所以您的示例如下所示:
%s/\\begin{equation}\_.\{-}\(\\\a*\)\@!\<t\>\ze\_.\{-}\\end{equation}/s/g
第二件事是使用非常神奇,大多数vim用户发现它更方便:
:%s/\v\\begin\{equation\}\_.{-}(\\\a*)@!<t>\ze\_.{-}\\end\{equation\}/s/g
您正在匹配像sqrt这样的单词,因为\\\a*
匹配空字符串。通过使用字词分隔符<
和>
(使用\v
)或\<
和\>
(不使用\v
),您可以限制{{{}的匹配1}}仅限于单个t
未被单词字符包围,就像它上面的单词一样。
然后你有两个选择,第一个是通过在标志中添加c来使用确认字符:
t
然后你可以有选择地使用替换或逃避它。第二种选择是使用范围限制匹配(如果你愿意,可以使用确认):
:%s/\v\\begin\{equation\}\_.{-}(\\\a*)@!<t>\ze\_.{-}\\end\{equation\}/s/gc
此致
答案 1 :(得分:0)
让我们一块一块地建立起来。首先,正如@rbernabe建议的那样,使用单词词头和词尾结构模式将“t”作为整个单词找到:
/\<t\>
接下来,要替换当前行上的所有内容,请使用
:s/\<t\>/s/g
现在,将光标放在\begin{equation}
行上。范围.,/\\end{equation}/
指定直到并包括等式环境结束的所有行,所以
:.,/\\end{equation}/s/\<t\>/s/g
将用该范围内的“s”替换所有单字“t”。要为文件中的所有方程式环境重复此命令,请使用:g/\\begin{equation}/{command}
:
:g/\\begin{equation}/.,/\\end{equation}/s/\<t\>/s/g
如果你想玩vimgolf,那么。是可选的。最后,如果您想处理多个环境,我担心无法将\begin{...}
中的变量环境名称与结束\end{...}
联系起来。如果没有嵌套类似等式的环境,则可以使用
:g/\\begin{\(equation\|align\|eqnarray\|multline\)}/.,/\\end{\(equation\|align\|eqnarray\|multline\)}/s/\<t\>/s/g
您还可以使用显式循环,如果存在嵌套环境,这可能会有所帮助:
:let envs = ['equation', 'align', 'eqnarray', 'multline']
:for env in envs
: execute 'g/\\begin{' . env . '}/.,/\\end{' . env . '}/s/\<t\>/s/g'
:endfor
当然,正则表达式不能代替真正的解析。只要您的实际LaTeX代码与您的样本相似,这应该可行,但如果您有类似
的话,您将遇到麻烦\end{equation} This is ordinary text with a t in it.