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)

(おそらく while $? -ne 0 ... rcode sed が「一致しない!」と言うために使用するものは何でも)

于 2012-05-11T21:33:26.510 に答える
0

これを試して:

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