2012-05-11 20 views
4

と中括弧のペア間のすべてを削除します。私はしてもしなくてもよい、同じ順序の更なる部分文字列を含むことができる、%{...}をマッチする部分を削除したい私はこのようになります文字列持っているSED

[%{%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}%}(それは%}を返します)のような文字列では失敗します。私が何をしたいか

は私が一致}を見つけるまで、かなり%{と私が遭遇最初}間のすべてを削除するよりも、それまでのすべてを削除し、文字列を解析しています。私はこれを行う方法がわかりません。

私はこれを行う方法はおそらく複数あることを十分に認識しています。可能であれば、質問で指定された方法に関する回答が好きですが、どんなアイデアも歓迎されている以上です。

+1

正規表現は、ネストされたかっこの照合には適していません。ネストされたかっこは通常の言語を形成しません。 –

+0

実際に正規表現を使用してネストされた括弧をマッチさせることはできませんが、有限の数字をより長い正規表現とマッチさせることはできますが、任意の数字にマッチさせることはできません。私は最大9つのレベルの入れ子にマッチするコードジェネレータを書きました。これはあなたが見た最大の正規表現でした。 – Benj

+0

+1サンプル入力、期待される出力、実際のコードが使用されています。がんばろう。 – shellter

答えて

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 *] 
+0

それは魅力を働かせます。それはあまりにも多くのトラブルではない場合は、どのように動作するの説明を与えることができますか? – simont

+0

まず、すべての '%{'を '{'に置き換え、すべての内部 '{...} 'を削除し、成功した場合はそれ以上繰り返さないでください。 – potong

0

再帰を使用して内側から外に出してください。その後

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

これはあなたのために働くかもしれない

while(there's at least one more brace) 

(おそらく言わないために使用するものは何でもRCODEのsed ... 0 -ne $しばらく? "何の試合を!")

+0

終了パターンが '%'ではなく孤立した '}'であるため、これはうまくいかないと思います。 – Jens

0

これを試してみてください:

sed -E 's/%{([^{}]*({[^}]*})*[^{}]*)*}//g' 
関連する問題