すべての* 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
あります(一部の実装では借ります)。-i
sed