2011-12-05 18 views
2

からオプション値を抽出:のは、私は、文字列を持っているとしましょう、だから、文字列

aaa -Dprop=var Class arg 
aaa Class arg 

私はargvarを抽出することができ、単一のワンライナー(perlの、sedは、awkは、重要ではありません)をしたいです(もしあれば)。具体的には、私は最初のもののために

arg var 
arg 

次作品を返却したいと思います:-Dprop=が必要とされているため

echo "aaa -Dprop=var Class arg" | perl -pe 's|.*(-Dprop=([a-z]*)).*Class (.*)|\3 \2|' 

しかし、それは明らかに二番目に動作しません。

、しかし、私はオプションに一致させる場合は、次の、私は2つを信じているから

echo "aaa -Dprop=var Class arg" | perl -pe 's|.*(-Dprop=([a-z]*))?.*?Class (.*)|\3 \2|' 

それは最初のもののために動作しません* sが貪欲修飾子であり、最初の-Dpropと一致します。

私はそれらを貪欲でないものにしても、まだ動作しませんが、私はなぜそれがわかりません。

echo "aaa -Dprop=var Class arg" | perl -pe 's|.*?(-Dprop=([a-z]*))?.*?Class (.*)|\3 \2|' 

まず、どの正規表現を使用すれば正しく一致させることができますか? (私は複数のコマンドに分割することができますが、むしろ1つしか持たない)。おそらく、

+0

1うわー、実際に投稿する前に、いくつかのコードを記述しようとした人! ;-) がんばろう。 – shellter

+0

"-Dprop ="は固定されているか、何か "foo = yourVar"でもかまいませんか? – Kent

+0

@Kent、-Dpropは固定されていますが、varは何でも構いませんが(特定の形式で) –

答えて

2

:\ 3が、より良い(プラグマを漏らすことになる警告)$ 3のように書かれていることにも

echo "aaa -Dprop=var Class arg"|perl -pe 's|(.*-Dprop=(.*))?.*Class\s*(.*)|$3 $2|' 

注意してください。

+0

パーフェクト!ありがとう! –

+0

全体的に+1ですが、もう少し調整が必要です: '$ 2'があれば' Class'の前に空白が入ります。 – ruakh

+0

私が必要としたのはコンセプトでした。その行は明らかに私が解析している正確な行ではありませんでした。私は、オプションのマッチに最初のワイルドカードを含めることについて決して考えなかった。 –

0

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

echo -e "aaa -Dprop=var Class arg\naaa Class arg"| 
sed 's/.*-Dprop=\([^ ]*\).*\(\)Class \([^ ]*\)\|.*Class \([^ ]*\)/\3\2\1\4/' 
arg var 
arg 
1
perl -pe 's|^.*?(?:-Dprop=([\S]+))?\s+Class\s+(.*?)$|\2 \1|' 
関連する問題