web-dev-qa-db-ja.com

一致する括弧を囲んでいるコンテンツに置き換えます

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}_と_}_のすべてのペアを1行で削除します。 2番目のコマンドは、複数の行にまたがるすべてのペアを削除します。

3
Oscillon

あなたが始めている単純な質問でさえ、いくらかの複雑さを隠しています。私はから始めます

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

括弧ペアがなくなるまで繰り返されます。これにより、最も内側のテキストが置き換えられます。

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

Kusalananda が示唆しているように、TeXコマンドを削除するには、TeX Live(およびほとんどのディストリビューション)で利用可能なdetexをチェックする必要があります。このような処理には、括弧や中括弧を一致させるだけでは不十分です。さまざまなコマンドの動作について少し知っておく必要があります。あなたの例でも、\color一方向に処理する必要があります。\textbf別の.。

0
Stephen Kitt