Как отделить команду с ее аргументами в формате строки, используя ruby - PullRequest
0 голосов
/ 15 мая 2018

Я должен передать команду с ее аргументами в запланированном задании, отделяя аргументы от команды. Я использовал:

split(/(?=\s-)/)

для этого, но он не будет работать, если аргумент не передан в формате -arg.

Пример команд можно передать в формате:

"ping http://www.google.com" here url is argument
"abc-abc -V"
"abc-abc -L c:\\folder name\\test.log"
'"C:\\Program Files\\example\\program.exe" -arg1 -arg2'
"C:\\Program Files\\example\\program.exe"

Для большей ясности эти команды не передаются в качестве аргумента командной строки, который можно получить в ARGV

Команда устанавливается в свойстве команды, которое принимает ввод в формате строки

command '"C:\\Program Files\\example\\program.exe" -arg1 -arg2'

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Мне кажется, что если в вашем командном синтаксисе нет единого шаблона, то любой подход на основе регулярных выражений неизбежно потерпит неудачу. Вместо этого, кажется, лучше решить эту проблему так, как это сделал бы человек, т. Е. Со знанием контекста .

В терминале * nix вы можете использовать команду compgen для вывода списка доступных команд. Этот скрипт Ruby вызывает эту команду для печати первых 5 опций из этого списка:

list = `cd ~ && compgen -c`
list_arr = list.split("\n")
list_arr[0,6].each{|x| puts x }

(cd в первой строке представляется необходимым из-за контекста, в котором мой Ruby работает с rvm.) Для Windows вы можете найти этот поток полезной отправной точкой.

Я бы сопоставил элементы этого списка, чтобы определить мои команды, и взял бы оттуда.

0 голосов
/ 15 мая 2018

Используйте Shellwords.split из стандартной библиотеки:

Shellwords.split("ping http:\\www.google.com here url is argument")
  #=> ["ping", "http:www.google.com", "here", "url", "is", "argument"]
Shellwords.split("abc-abc -V")
  #=> ["abc-abc", "-V"]
Shellwords.split("abc-abc -L c:\\folder name\\test.log")
  #=> ["abc-abc", "-L", "c:folder", "nametest.log"]
Shellwords.split('"C:\\Program Files\\example\\program.exe" -arg1 -arg2')
  #=> ["C:\\Program Files\\example\\program.exe", "-arg1", "-arg2"]
Shellwords.split('"C:\\Program Files\\example\\program.exe"')
  #=> ["C:\\Program Files\\example\\program.exe"]

Нет необходимости заново изобретать колесо с помощью пользовательского регулярного выражения / сплиттера или внешнего системного вызова.

0 голосов
/ 15 мая 2018

Ответ Тома Лорда намного лучше, чем этот.


Вы, вероятно, захотите посмотреть OptionParser или GetOptLong , есливам нужен синтаксический анализ аргументов командной строки, предоставляемых программе ruby.


Если вы заинтересованы в разборе некоторых строк, которые могут быть или не быть командами с аргументами, вот краткий пример:

Я бы использовал scan вместо split со следующим регулярным выражением: /(".*"|[\w\:\:\.\-\\]+)/.

Лучшие результаты получены от: 'some string'.scan(/(".*"|[\w\:\:\.\-\\]+)/).flatten:

["ping", "http:\\www.google.com"]
["abc-abc", "-V"]
["abc-abc", "-L", "c:\\folder\\", "name\\test.log"]
# Technically, this is wrong, but so is the non-escaped whitespace.
["\"C:\\Program Files\\example\\program.exe\"", "-arg1", "-arg2"]
["\"C:\\Program Files\\example\\program.exe\""]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...