2017-02-10 9 views
2

Helo!groovyのコマンドライン引数にアスタリスク(*)を使用するにはどうすればよいですか?

私は1つの議論で独創的なスクリプトを持っています。引数は正規表現のパターンでなければなりません。私は引数に*を使用したいが、いつも持っている:コマンドの構文が間違っている。

これは(opt.pは、引数から取得したパターンである)の例である:

def map1 = [e:'pine___apple', f:'pineapple'] 
    map1.each { entry -> 
       entry.value.find(~/$opt.p/) { match -> println entry.value} 
       } 

私はこのように、コマンドラインからスクリプトを使用したい:

グルーヴィーテスト-p pine_ *

そして、私は結果がなることを期待:

pine___apple
パイナップル

は、私はこれらのソリューションなどを試してみましたが、何もうまくいかない:
pine_*a
"pine_*a"
'pine_*a'
pine_\*a
'pine_\*a'
"pine_\*a"
pine_'\*'a
pine_"\*"a
pine_'\\*'a
pine_"\\*"a

誰かがこの問題を解決する方法を知っていますか? ありがとう!

EDIT:
私が使用します。
Groovyのバージョン:2.4.6 JVM:1.7.0_45ベンダー:オラクル・コーポレーションのOS:Windows 7の
そして私もCliBuilder使用:

def cli = new CliBuilder() 
     cli.with 
     { 
      p('pattern', args: 1, required: false) 
     } 
     def opt = cli.parse(args) 
+0

なぜあなたは 'opt.p'にあなたの議論があると思いますか? Groovyにこの変数を設定するコードがありますか? 'opt.p'を印刷してその内容を確認してください。 – Vampire

+0

値が引用符で囲まれていない場合は、ファイル名の代わりにシェルが使用されます。次に例を示します。 'touch pine_fooled_ya; groovy test -p pine_ * a'です。 'groovy test -p 'pine_ * a'' –

答えて

0

次のGroovyスクリプト:

def map = [e:'pine___apple', f:'pineapple'] 
map.each { k, v -> 
    v.find(~/${args[0]}/) { println "key: $k, value: $v -> ${v.find(args[0])}" } 
} 

プリントfollowinを呼び出しのG:

$ groovy test.groovy pine_*a 
Checking key: e, value: pine___apple -> pine___a 
Checking key: f, value: pineapple -> pinea 

またはマップエントリの1つを除外するために:あなたのスクリプトの問題が何であるか

$ groovy test.groovy "pine_{1,9}a" 
key: e, value: pine___apple -> pine___a 

わかりません。おそらく、コメントの1つのようにopts.pの処理が示唆しているでしょう。

彼の答えにティム・イエーツが言及したものに代わるCliBuilder構文:

def opt = new CliBuilder().with { 
    p longOpt: 'pattern', args: 1 
    parse(args) 
} 

編集2:ソリューションこのよう

としてマークされている編集が1

受け入れられた答え、私はここに解決策になってしまったものを追加します(私はこれにコメントがありますが、溶出)。

この問題は、groovyを起動するために使用されるwindows groovy distribution startgroovy.batファイル(see separate stackoverflow thread)のバグが原因でした。問題は、ウィンドウの実行とパラメータの処理であり、groovyプログラムが実行を開始する前に発生します。 groovyのそれ以降のバージョンで修正された可能性がありますので、最新バージョンにアップグレードする価値があります。そうでない場合は、上記のスレッドの答えでstartgroovy.batを修正する必要があります。

+0

私はあなたの例を試してみましたが、" pine_ {1,9} a "という引数で私はあなたと同じ結果を得ました。しかしpine_ * aは私にとってはうまくいかない。私はまだ私が前に述べた構文エラーを持っています。私は本当に何が問題なのか分からない。上記の私の質問を編集し、CliBuilderをどのように使用し、どのようなGroovyバージョンで動作するかを編集しました。他にも何が問題なのでしょうか? –

+0

'groovy test.groovy"のように引用できますか?ping_ * a "'? –

+0

私は試しました。まだ構文エラーがあります。 'test.groovy" pine_ {1,9} a "は働いていて、あなたと同じ結果を得ましたが、' groovy test.groovy "ping_ * a" 'は構文エラーを持っていました。 –

0

は、それは私はあなたがCliBuilder

を使用していて、私はあなたがpパラメータ

def opt = new CliBuilder().with { 
    it.p('pattern', args: 1) 
    parse(args) 
} 

def map1 = [e:'pine___apple', f:'pineapple'] 
map1.each { entry -> 
    entry.value.find(~/$opt.p/) { match -> println entry.value} 
} 
の定義から args: 1を見逃している疑いがあると仮定し、あなたの opt

をキャプチャしている方法だと思います

あなたはそれが私のために必要であると説明しています...

+0

はい。私はCliBuilderを使用し、私もargs:1を使用します。私はあなたの例を試して、私のために働かない。私はまだ私が前に述べた構文エラーを持っています。私は本当に何が問題なのか分からない。上記の私の質問を編集し、CliBuilderをどのように使用し、どのようなGroovyバージョンで動作するかを編集しました。他にも何が問題なのでしょうか? –

関連する問題