いくつかのテキストがあり、そのうちのいくつかはでマークされています_{...}
。閉じる下線と中括弧のペアをアスタリスクで置き換える必要があります。たとえば、Hello _{world} _{foo}
になりますHello *world* *foo*
。
sed -r 's/_\{([^}]+)}/*\1*/g'
これは、中かっこエスケープを含めることができるという事実でなければ簡単に解決できる簡単な問題です。たとえば、テキストは次のようになります。
Hello _{world \} \}} _{foo bar}
結果は次のとおりです。
Hello *world } }* *foo bar*
どうすればいいですか?
答え1
バックスラッシュが「次の文字エスケープ」(中括弧、他のバックスラッシュ、または行末を除くすべての文字)を意味する場合は、次の文字を次のように「スキップ」できます。
sed -r 's/_\{((\\.|[^}\\])+)\}/*\1*/g
バックスラッシュが中括弧の前でのみ特別な意味を持つ場合は、バックスラッシュを1つ以上実行するたびに、バックスラッシュではなく最初の文字を「スキップする」必要があります。
sed -r 's/_\{((\\+[^\]|[^}\\])+)\}/*\1*/g'
答え2
先行しない項目を一致させるには、否定的な振り返りが必要です。sed
LookaheadとLookbehindはサポートされていませんが、Perlはサポートしています。
echo 'Hello _{world \} \}} _{foo bar}' | perl -npe 's/_\{(.+?)(?<!\\)}/*\1*/g'
すると、以下が出力されます。
Hello *world \} \}* *foo bar*