Text-Processing

用封閉的內容替換匹配的括號

  • February 16, 2017

在 bash 中使用 sed/awk 查找匹配的連續括號對並用它們的封閉內容替換它們的簡單方法是什麼?

一個最小的例子是:

輸入:

(body1)

輸出:

body1

解決方案不足:

這可以通過

echo "(body1)" | sed 's/[()]//g'

擴展問題

但簡單地刪除所有的左/右括號是不夠的,因為最終目標是從源文件中刪除某些,而不是所有(tex)命令,例如

輸入:

Alea {\color{red}iacta} est. \textbf{Hic} forum est, populus {\color{red}properant}.

輸出:

Alea iacta est. \textbf{Hic} forum est, populus properant.

到目前為止,我只設法提取文本:

awk -v FS="({\\color{red}|})" '{print $2}' $file.tex

獎金

可以sed -E 's/\{\\color\{red}([^{}]*)\}/\1/g'只刪除 \color{red} 命令 - 但是,命令的開始和結束需要在同一行。

如何刪除右括號前跨越多行的命令}

獎金解決方案

如果有人感興趣,以下命令似乎可以解決獎金問題: sed -i -r 's#\{\\color\{red\}([^}]*)\}#\1#g' $file.tex sed -i -r ':a;N;$!ba;s#\{\\color\{red\}([^}]*)\}#\1#' $file.tex

第一個命令在一行中刪除所有對{\color{red}和。}第二個命令刪除跨越多行的所有對。

即使是您開始的簡單問題也隱藏了一些複雜性。我會從

sed -E 's/\(([^()]*)\)/\1/'

重複直到沒有括號。這將替換最裡面的文本:

$ echo "((body))" | sed -E 's/\(([^()]*)\)/\1/'
(body)

不過,正如Kusalananda所建議的那樣,要剝離 TeX 命令,您應該檢查detexTeX Live(以及大多數發行版)中可用的命令。這樣的處理需要的不僅僅是匹配括號或大括號:您需要了解一些關於各種命令的行為。即使在您的範例中,\color也需要以一種方式處理,\textbf另一種…

引用自:https://unix.stackexchange.com/questions/345154