我正在 Markdown 中为 Go 模板语言编写一些文档,其中关于成对双花括号有一些复杂性。显示双花括号包围的文本需要转义,因为双花括号本身就是转义。因此,必须引用正确的一对大括号,然后将其括在其自己的一组大括号内。左一对也是如此。所以:对于受保护的代码示例,您需要替换
{{ foo.1 }}
和
{{"{{"}}foo.1{{"}}"}}
我快到了。我的代码可以工作,但保留了原来的花括号。到目前为止我有这个:
echo "{{ foo.1 }} {{ foo.2 }}" | sed -E 's#({{[^}}]*}})#{{"{{"}}\1{{"}}"}}#g'
结果是:
{{"{{"}}{{ foo.1 }}{{"}}"}} {{"{{"}}{{ foo.2 }}{{"}}"}}
如何删除上面示例中最里面的一对大括号?
答案1
你的表情有几处很尴尬sed
。
[^}}]
与 a 相同[^}]
并且会匹配 a单身的不是 的字符}
。{
and}
在扩展正则表达式中很特殊(它们的工作方式类似于*
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
上面的表达式是几乎一模一样与您的相同,只是我没有使用扩展的正则表达式,并且我已将捕获组移动到单词中{{ ... }}
(这就是您删除结果中最里面的大括号的方法)。
答案2
我收到类似错误消息
sed:-e表达式#1,字符35:前面的正则表达式无效
如果尝试你的上述sed
。尝试一下
echo "{{ foo.1 }} {{ foo.2 }}" | sed 's/\({\|}\)\1/{{"&"}}/g'
{{"{{"}} foo.1 {{"}}"}} {{"{{"}} foo.2 {{"}}"}}