使用sed将LaTeX pmatrix命令转换为amsmath pmatrix环境

时间:2014-04-08 18:00:10

标签: regex sed

我有一个旧的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并行调用有关,但我不知道如何修改正则表达式以使其正常工作。

我搜索了谷歌,但是对于正则表达式来说是如此新鲜,我只是对所有的变体和使用的变体感到困惑,以及如何正确地格式化这样的东西。

2 个答案:

答案 0 :(得分:0)

以下内容可能适合您:

sed -re 's/(\\pmatrix)\{([^}]*)}/\\begin{pmatrix}\2\\end{pmatrix}/g' -e 's/\\cr/\\\\/g' -e 's/\\\\\\end/\\end/g' inputfile

这适用于:

  • 用{\ begin {matrix} ... \ end {matrix}
  • 替换\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