2014-04-08 31 views
0

我有一箇舊的LaTeX文檔(有很多的格式命令),我要轉換爲更現代的乳膠(我想要做的更新有以下幾個原因,而不是其中至少是減少內容和格式之間的耦合)。無論如何,文檔有很多電話到過時的命令\pmatrix{ .... },我願與新amsmath命令\begin{pmatrix} ... \end{pmatrix}取代的。我一直在嘗試使用sed來進行這種轉換,但我以前從未使用過它,並且遇到了麻煩。轉換乳膠pmatrix命令amsmath 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

下可能會爲你工作:

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' 
+0

謝謝,我會在一個位測試,並接受它是否工作 – slbass

+0

這是非常接近,但也有一些'}'前的最後'\\}'。我編輯了這個問題來反映這一點。我認爲這個解決方案要求我以某種方式檢查一個不重複的字符序列'\\}',而不是'}',但我還沒有找到一種方法去做。 – slbass

+0

@slbass上面的編輯可能適合你。如果你想讓輸出出現在同一行,輸出到'paste -sd'''。 – devnull

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's。