Goテンプレートドキュメントのsedの問題:「{{ foo.1}}」を{{"{{"}} foo.1{{"}}"}}に置き換えてください。

Goテンプレートドキュメントのsedの問題:「{{ foo.1}}」を{{

私は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上記の表現は次のとおりです。ほぼ同じ拡張正規表現を使用せずにキャプチャグループを単語に移動したことを除いて、あなたと同じです{{ ... }}(結果から最も内側の中括弧を削除する方法です)。

おすすめ記事