Экранирование строки Ruby для команды $ DIALOG в TextMate - PullRequest
2 голосов
/ 15 января 2010

Вызов гуру регулярных выражений. У меня сейчас есть некоторые проблемы с экранированием строки в Ruby, чтобы я мог передать ее в утилиту командной строки, используя exec, %x{} или подобное. Командная строка - это диалоговая функция TextMate, которая в основном работает следующим образом (Запустите это как скрипт оболочки в TextMate.):

$DIALOG -mp "items=('string1','string2', 'string3');" RequestItem

, но он также может использовать указанный вами nib-файл, например, "path / to / my / nib / file.nib". Поэтому мне нужно передать всю эту команду в виде строки exec

command = <<string
$DIALOG -mp "items=('string1','string2', 'string3');" "path/to/my/nib/file.nib"
string
exec command

Это работает нормально, естественно. Проблема, с которой я сталкиваюсь, состоит в том, что компоненты массива элементов определяются программно, поэтому мне нужно программно экранировать эту строку таким образом, чтобы она все правильно передавалась команде $DIALOG.

Пока что я определил необходимость избегать одинарных кавычек, двойных кавычек, а также символов новой строки и табуляции. Я испробовал множество потенциальных решений для регулярных выражений, но пока не смог найти надежный механизм побега. В основном мне нужно заполнить

class String
    def escape_for_dialog
        self
    end
end

с правильными self.gsub вызовами, которые будут экранировать строки, которые я помещаю в параметры. Итак, давайте предположим, что мои параметры ищутся во время выполнения, вот что я думаю, что мне нужно сделать, используя тот же пример выше:

command = <<string
$DIALOG -mp "items=('#{item1.escape_for_dialog}', '#{item2.escape_for_dialog}', '#{item3.escape_for_dialog}');" "path/to/my/nib/file.nib"
string
exec command

Я выяснил, что стиль heredoc помогает избежать необходимости запоминать экранирование всех кавычек, но параметры все еще проблематичны, поэтому я прошу кого-то лучше с манипулированием строками и регулярными выражениями, чем помогать при заполнении этого метода строки. Я буду очень благодарен! :)

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

К сожалению, ответ на этот вопрос намного проще, чем может показаться: TextMate имеет метод Ruby! TextMate.app/Contents/SharedSupport/Support/lib#e_sh

2 голосов
/ 15 января 2010

String.inspect будет экранировать разделители и т. Д. Таким образом, что оболочка будет счастливой:

itemlist = "(#{items.join(', ')})"
command = [
  $DIALOG,
  '-mp',
  itemlist.inspect,
  'path/to/my/nib/file.nib',
].join(' ')
system(command)
1 голос
/ 15 января 2010

Вы можете использовать библиотеку «escape» для экранирования оболочки или, альтернативно, использовать exec и передавать ей массивы - если это так, exec будет автоматически экранироваться с помощью макроса SafeStringValue ()

...