私はGoテンプレート言語のMarkdownドキュメントを書いていますが、二重中括弧のペアに関していくつかの複雑な問題があります。二重中括弧で囲まれたテキストを表示するには、二重中括弧自体がエスケープされるため、エスケープが必要です。したがって、正しい中括弧のペアを引用してから、それを独自の中括弧セット内に囲む必要があります。左ペアにも同じです。したがって、保護されたコード例の場合は交換する必要があります。
{{ foo.1 }}
そして
{{"{{"}}foo.1{{"}}"}}
すぐに到着します。私のコードは動作しますが、元の中かっこを保持します。これまで私はこれを持っています:
echo "{{ foo.1 }} {{ foo.2 }}" | sed -E 's#({{[^}}]*}})#{{"{{"}}\1{{"}}"}}#g'
結果:
{{"{{"}}{{ foo.1 }}{{"}}"}} {{"{{"}}{{ foo.2 }}{{"}}"}}
上記の例では、最も内側の中かっこペアをどのように削除しますか?
ベストアンサー1
あなたの表現には恥ずかしい部分がいくつかありますsed
。
[^}}]
aと同じ[^}]
で、aと一致します。一つではない文字です}
。{
}
拡張正規表現の中で特別です(andのように動作します。*
つまり+
、前の式が一致する回数を指定します(たとえば、a{2,4}
2と4の間a
)。これは、一部のsed
実装(GNU)で式を解析するのに問題があることを意味します。します。
ここではデフォルトの正規表現を使用し、sed
その中の単語に{{ ... }}
英数字とドットを含めることができます([[:alnum:].]
これに変更できます[^ ]
)。
$ echo '{{ foo.1 }} {{ foo.2 }}' | sed 's/{{ \([[:alnum:].]*\) }}/{{"{{"}} \1 {{"}}"}}/g'
{{"{{"}} foo.1 {{"}}"}} {{"{{"}} foo.2 {{"}}"}}
これはGNUsed
とBSD sed
(あなたが使っていると思います)の両方で動作します。
sed
上記の表現は次のとおりです。ほぼ同じ拡張正規表現を使用せずにキャプチャグループを単語に移動したことを除いて、あなたと同じです{{ ... }}
(結果から最も内側の中括弧を削除する方法です)。