2013-06-26 1 views
5

Я создаю простую оболочку для проекта, и я хочу, чтобы строки аргументов разбирались так же, как в Bash.Как разбить строку аргумента Bash в Ruby?

foo bar "hello world" fooz 

должны стать:

["foo", "bar", "hello world", "fooz"] 

т.д. До сих пор я использую CSV::parse_line, установив разделитель столбцов в " " и .compact ИНГ выход. Проблемы в том, что теперь я должен выбрать, хочу ли я поддерживать одиночные кавычки или двойные кавычки. CSV не поддерживает более одного символа разделителя.

Python имеет модуль именно это называется shlex:

>>> shlex.split("Test 'hello world' foo") 
['Test', 'hello world', 'foo'] 
>>> shlex.split('Test "hello world" foo') 
['Test', 'hello world', 'foo'] 

Существуют ли скрытые встроенные модули Ruby, которые могут сделать это? Любые предложения для решения будут оценены.

+1

Конечно есть: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/shellwords/rdoc/Shellwords.html#method -с-shellsplit. :) – squiguy

ответ

8

рубин имеет модуль Shellwords:

require "shellwords" 

Shellwords.shellsplit('Test "hello world" foo') 
# => ["Test", "hello world", "foo"] 

'Test "hello world" foo'.shellsplit 
# => ["Test", "hello world", "foo"] 
+0

Я считаю, что это 'shellsplit', вы избили меня! – squiguy

+0

@squiguy 'Shellwords # split' является псевдонимом для' Shellwords # shellsplit'. – toro2k

+2

После импорта «shellwords» вы также можете выполнить «Тест» hello world «foo'.shellsplit' – Hubro