一致する括弧を含むコンテンツに置き換える

一致する括弧を含むコンテンツに置き換える

sed / awkを使用してbashで一致する連続括弧を見つけ、埋め込みコンテンツに置き換える簡単な方法は何ですか?

最小限の例は次のとおりです。

入力する:

(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

ボーナス

\color{red}コマンドのみを削除することも可能ですsed -E 's/\{\\color\{red}([^{}]*)\}/\1/g'。ただし、コマンドの始まりと終わりは同じ行になければなりません。

閉じ括弧の前に複数行にまたがるコマンドを削除するには}

ボーナスソリューション

誰にも興味がある場合は、次のコマンドを使用してボーナスの問題を解決するようです。 sed -i -r 's#\{\\color\{red\}([^}]*)\}#\1#g' $file.tex sed -i -r ':a;N;$!ba;s#\{\\color\{red\}([^}]*)\}#\1#' $file.tex

最初のコマンドは{\color{red}行のすべての合計を削除します。}2番目のコマンドは、複数行にまたがるすべてのペアを削除します。

答え1

最初に尋ねる簡単な質問にもいくつかの複雑さが隠れています。私は始めます

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

括弧がなくなるまで繰り返し。これは最も内側のテキストを置き換えます。

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

提案通り先行は達成するのが難しいdetexただし、TeXコマンドを削除するには、TeX Live(およびほとんどのディストリビューション)で利用可能なものを確認する必要があります。この種の処理には、単に括弧や中括弧を一致させる以上のものが必要です。つまり、さまざまなコマンドの動作について知る必要があります。あなたの例でも\color1つの方法で行う必要があります\textbf

関連情報