Go 模板文档的 sed 问题:尝试用 {{"{{"}}foo.1{{"}}"}} 替换 "{{ foo.1 }}"

Go 模板文档的 sed 问题:尝试用 {{"{{"}}foo.1{{"}}"}} 替换 "{{ foo.1 }}"

我正在 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 {{"}}"}}

相关内容