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(およびほとんどのディストリビューション)で利用可能なものを確認する必要があります。この種の処理には、単に括弧や中括弧を一致させる以上のものが必要です。つまり、さまざまなコマンドの動作について知る必要があります。あなたの例でも\color
1つの方法で行う必要があります\textbf
。