4

我有一个看起来像这样的字符串:

[%{%B%F{blue}%}master %{%F{red}%}*%{%f%k%b%}%{%f%k%b%K{black}%B%F{green}%}]

我想删除匹配的子字符串%{...},它可能包含也可能不包含相同顺序的其他子字符串。

我应该得到:[master *]作为最终输出。到目前为止我的进展:

gsed -E 's/%\{[^\}]*\}//g'

这使:

echo '[%{%B%F{blue}%}master %{%F{red}%}*%{%f%k%b%}%{%f%k%b%K{black}%B%F{green}%}]' | gsed -E 's/%\{[^\}]*\}//g'
[%}master %}*%B%F{green}%}]

因此,这对于%{...}不包含. 对于像(它返回)这样的字符串,它会失败。%{...}%{%B%F{blue}%}%}

我想要做的是解析字符串,直到找到匹配 }的,然后删除直到那个点的所有内容,而不是删除与我遇到%{第一个之间的所有内容。 }我不知道该怎么做。

我完全意识到可能有多种方法可以做到这一点。如果可能的话,我希望得到关于问题中指定方式的答案,但任何想法都非常受欢迎。

4

3 回答 3

1

这可能对您有用:

echo '[%{%B%F{blue}%}master %{%F{red}%}*%{%f%k%b%}%{%f%k%b%K{black}%B%F{green}%}]' |
sed 's/%{/{/g;:a;s/{[^{}]*}//g;ta'
[master *]
于 2012-05-11T21:44:59.717 回答
0

使用递归从内到外吃掉它。

s/%{.*?%}//g

然后包进去

while(there's at least one more brace)

(可能而 $? -ne 0 ...无论 rcode sed 用来说“不匹配!”)

于 2012-05-11T21:33:26.510 回答
0

试试这个:

sed -E 's/%{([^{}]*({[^}]*})*[^{}]*)*}//g'
于 2012-05-11T22:01:12.813 回答