sedを使用して* text *を{\ i text}に変換するには?

sedを使用して* text *を{\ i text}に変換するには?

すべての* text *エントリを{\ i text}に置き換えたいです。

text *text* text
*text* text *text*
*text text text* text

しなければならない

text {\i text} text
{\i text} text {\i text}
{\i text text text} text

など。

どうすればいいですか?

答え1

各仮説は*some text*1行に表示されます(つまり、複数行に分割されていません)。

sed -r 's/\*([^*]+)\*/{\\i \1}/g' file

答え2

POSIXと同様に、複数行にわたって表示できるsed場合は、*...*次のようにできます。

sed -e :1 -e 's/\*\([^*]\{1,\}\)\*/{\\i \1}/g;/\*/!b' -e '$q;N;b1'

一部のsed実装では、パターンスペースのサイズに対する制限が比較的低いため、あまりにも*...*多くの(長い)行が拡張されると、これらの実装は失敗する可能性があります。

パールの使用:

perl -0777 -pe 's/\*(.*?)\*/{\\i $1}/gs'

しかし、交換を実行する前にメモリ内のファイル全体を占めるため、大容量ファイルの場合は問題になる可能性があります。また、ファイルを所定の場所に更新するオプションもperlあります(一部の実装では借ります)。-ised

関連情報