我有一个旧的LaTeX文档(有很多格式化命令),我想转换为更现代的LaTeX(我想做更新有几个原因,其中最重要的是减少内容之间的耦合和格式化)。无论如何,该文档对已弃用的命令\pmatrix{ .... }
进行了大量调用,我想用新的amsmath命令\begin{pmatrix} ... \end{pmatrix}
替换它。我一直在尝试使用sed
进行此转换,但我之前从未使用过它,而且我遇到了麻烦。
这是一个MWE LaTeX输入字符串
\pmatrix{0&0\cr \frac{1}{2}&0\cr 0&0\cr}\pmatrix{1&1\cr 1&1\cr 1&1\cr}
预期输出
\begin{pmatrix}0&0\\ \frac{1}{2}&0\\ 0&0\end{pmatrix}\begin{pmatrix}1&1\\ 1&1\\ 1&1\end{pmatrix}
我尝试使用的命令是以下
的变体sed 's/\\pmatrix{\(.*\cr[ ]*\)}/\\begin{pmatrix}\1 \\end{pmatrix}/g' <$WORKING_FILE >$OUTPUT_FILE
但是我能够实现的最接近的输出是
\begin{pmatrix}0 & 0 \\ 0 & 0 \\ 0 & 0 \end{pmatrix}
我很确定问题与两个pmatrix
并行调用有关,但我不知道如何修改正则表达式以使其正常工作。
我搜索了谷歌,但是对于正则表达式来说是如此新鲜,我只是对所有的变体和使用的变体感到困惑,以及如何正确地格式化这样的东西。
答案 0 :(得分:0)
以下内容可能适合您:
sed -re 's/(\\pmatrix)\{([^}]*)}/\\begin{pmatrix}\2\\end{pmatrix}/g' -e 's/\\cr/\\\\/g' -e 's/\\\\\\end/\\end/g' inputfile
这适用于:
\pmatrix{...}
\cr
替换\\
\\\end
以使其\end
编辑:根据您的更新,您可能最好在使用grep
之前拆分相关部分,然后再切换到sed
:
grep -oP '\\pmatrix.*?\\cr}' inputfile | sed -re 's/\\pmatrix\{(.*)}/\\begin{pmatrix}\1\\end{pmatrix}/g;s/\\cr/\\\\/g;s/\\\\\\end/\\end/g'
答案 1 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/\\cr/\n/g;s/\\(pmatrix)\{([^\n]*)\n([^\n]*)\n([^\n]*)\n\}/\\begin{\1}\2\\\\ \3\\\\ \4\\end{\1}/g;s/\n/\\cr/g' file
将\\cr
转换为换行符。执行全局替换命令。然后将这些换行符转换回\\cr
。