我正在为 Markdown 中的 Go 模板语言编写一些文档,这对成对的双花括号有一些复杂性。显示由双花括号包围的文本需要转义,因为双花括号本身就是转义。因此,必须引用正确的花括号对,然后将其包含在自己的花括号中。左对也一样。所以:对于围栏代码示例,您需要替换
{{ foo.1 }}
和
{{"{{"}}foo.1{{"}}"}}
我快到了。我的代码有效,但保留了原始花括号。到目前为止我有这个:
echo "{{ foo.1 }} {{ foo.2 }}" | sed -E 's#({{[^}}]*}})#{{"{{"}}\1{{"}}"}}#g'
结果是:
{{"{{"}}{{ foo.1 }}{{"}}"}} {{"{{"}}{{ foo.2 }}{{"}}"}}
如何删除上面示例中最里面的一对花括号?
sed
你的表达方式有几件事很尴尬。[^}}]
与非 . 的单个字符相同,[^}]
并且将匹配单个字符}
。{
and}
在扩展正则表达式中是特殊的(它们像*
and一样工作+
,即它们指定前一个表达式需要匹配多少次,如在a{2,4}
2 和 4 之间匹配a
)。这意味着某些sed
实现(GNU)会在解析您的表达式时遇到问题。在这里,我使用带有 的基本正则表达式
sed
,并且允许其中的单词{{ ... }}
包含任何字母数字字符和点(您可以更改[[:alnum:].]
为[^ ]
):这适用于 GNU
sed
和 BSDsed
(我相信你正在使用)。您会注意到
sed
上面的表达式与您的几乎完全相同,除了我没有使用扩展的正则表达式并且我已将捕获组移入单词 inside{{ ... }}
(这就是您删除最里面的花括号的方法得到你的结果)。我收到错误消息,例如
如果尝试你的上述
sed
。试试吧