2017-02-10 2 views
2

Helo!Как я могу использовать звездочку (*) в аргументах командной строки в groovy?

У меня есть отличный скрипт с одним аргументом. Аргумент должен быть шаблоном регулярного выражения. Я хочу использовать * в аргументе, но всегда получил: Синтаксис команды неверен.

Это пример (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 Производитель: Корпорация Oracle 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

Следующий скриптовый код:

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 г при вызове:

$ 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 синтаксис для одного упомянутого Тимом Йейтс в своем ответе:

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

редактировать 2: раствор

как это отмечается как принятый ответ, я добавлю, что в конечном итоге было решением здесь (у меня есть комментарий к этому ниже, но комментарии не сразу очевидны при просмотре для lution).

Эта проблема была вызвана ошибкой в ​​раздаточном файле Windows startgroovy.bat (see separate stackoverflow thread), который используется для запуска groovy. Проблема заключается в выполнении окон и обработке параметров, и это происходит до того, как программа groovy даже начинает выполнение. Существует справедливая вероятность, что это было исправлено в более поздних версиях groovy, поэтому стоит попробовать обновиться до последней версии. Если нет, ответ в приведенной выше теме должен помочь исправить startgroovy.bat.

+0

Я попробовал ваш пример и с помощью« pine_ {1,9} a »arg у меня получился тот же результат, что и вы, но сосновый не работает для меня. Я все еще получил синтаксическую ошибку, о которой я упомянул ранее. Я действительно не знаю, в чем проблема. Я отредактировал мой вопрос выше, как я использую CliBuilder и с какой классной версией. Любая другая идея, что может быть проблемой? –

+0

Не могли бы вы попробовать процитировать как в 'groovy test.groovy 'ping_ * a?'? –

+0

Я пробовал. Все еще получил синтаксическую ошибку. С 'test.groovy 'pine_ {1,9} a" 'работает и получает тот же результат, что и вы, но с' groovy test.groovy' ping_ * a "' получил синтаксическую ошибку. –

0

Думает, что это путь вы захватить ваш opt

Я предполагаю, что вы используете CliBuilder

И я подозреваю, что вы пропустили args: 1 из определения 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} 
} 

Работы, как вы это описываете, должны для меня ...

+0

Да. Я использую CliBuilder, и я использую args: 1 тоже. Я попробовал ваш пример и не работал для меня. Я все еще получил синтаксическую ошибку, о которой я упомянул ранее. Я действительно не знаю, в чем проблема. Я отредактировал мой вопрос выше, как я использую CliBuilder и с какой классной версией. Любая другая идея, что может быть проблемой? –

Смежные вопросы