2017-02-10 67 views
2

Helo!如何在groovy中的命令行參數中使用星號(*)?

我有一個參數的groovy腳本。爭論必須是一個正則表達式模式。我想在參數中使用*,但總是得到:該命令的語法不正確。

這是一個例子(opt.p是將圖案從ARG獲得):我想從這樣的命令行中使用腳本

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


groovy test -p pine_ * a

我期待的結果是:

pine___apple
菠蘿

我嘗試這些解決方法多,但沒有任何工程:
pine_*a
"pine_*a"
'pine_*a'
pine_\*a
'pine_\*a'
"pine_\*a"
pine_'\*'a
pine_"\*"a
pine_'\\*'a
pine_"\\*"a

有人知道如何解決這個問題? 非常感謝!

編輯:
我用:
Groovy的 版本:2.4.6 JVM:1.7.0_45供應商:Oracle公司操作系統: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

如果該值未加引號,則需要用shell代替文件名。例如:'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])}" } 
} 

打印以下g還調用:

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

或排除映射條目之一:

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

不知道用什麼腳本中的問題。也許像其中一個評論的處理opts.p建議。

編輯1

替代CliBuilder語法由Tim耶茨在他的回答中提到的一個:

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

編輯2:溶液

,因爲這被標記爲接受的答案是,我將添加最終成爲解決方案的地方(我在下面對此進行了評論,但是在瀏覽時如此評論並不明顯) lution)。

此問題是由用於啓動groovy的windows groovy distribution startgroovy.bat文件(see separate stackoverflow thread)中的一個錯誤引起的。問題在於windows執行和參數處理,它在groovy程序開始執行之前就已經出現了。這有一個公平的機會,已經在較新版本的groovy中得到修復,因此可能值得嘗試升級到最新版本。如果沒有,上述線程的答案應該可以修復startgroovy.bat

+0

我試過你的例子,並用「pine_ {1,9} a」arg得到了和你一樣的結果,但松樹a不適合我。我仍然遇到了前面提到的語法錯誤。我真的不知道是什麼問題。我上面編輯了我的問題,我如何使用CliBuilder以及哪個常用版本適用。任何其他想法可能是什麼問題? –

+0

你可以嘗試引用'groovy test.groovy「ping_ * a」'? –

+0

我試過了。仍然有語法錯誤。用'test.groovy「鬆@ {1,9}一個」'正在工作,並得到了和你一樣的結果,但是'groovy test.groovy「ping_ *一個」'有語法錯誤。 –

0

認爲這是你捕捉的方式你opt

我假設你正在使用的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

按照你描述的那樣工作應該對我...

+0

是的。我使用CliBuilder,我也使用參數:1。我試過你的榜樣,不適合我。我仍然遇到了前面提到的語法錯誤。我真的不知道是什麼問題。我上面編輯了我的問題,我如何使用CliBuilder以及哪個常用版本適用。任何其他想法可能是什麼問題? –

相關問題