为TextMate的$ DIALOG命令转义Ruby字符串

时间:2010-01-15 15:45:42

标签: ruby regex string textmate

致电正则表达专家。我现在遇到一些麻烦,在Ruby中转义一个字符串,以便我可以使用exec%x{}或类似的方法将它传递给命令行实用程序。命令行命令是TextMate对话框功能,它基本上像这样工作(在TextMate中将其作为shell脚本运行。):

$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

这自然很好用。我遇到的问题是items数组的组件是以编程方式确定的,所以我需要以编程方式转义此字符串,以便将其全部传递给$DIALOG命令。

到目前为止,我已经确定需要转义单引号,双引号以及换行符和制表符。我已经尝试了大量潜在的正则表达式解决方案,但还没有找到可靠的转义机制。基本上,我需要填写

class String
    def escape_for_dialog
        self
    end
end

使用正确的self.gsub调用将转义我放入参数的字符串。所以,让我们假设我的params在运行时查找,这是我认为我需要使用上面相同的例子做的事情:

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 个答案:

答案 0 :(得分:2)

String.inspect将转义分隔符&amp;以一种让贝壳开心的方式:

itemlist = "(#{items.join(', ')})"
command = [
  $DIALOG,
  '-mp',
  itemlist.inspect,
  'path/to/my/nib/file.nib',
].join(' ')
system(command)

答案 1 :(得分:2)

可悲的是,答案要比看起来简单得多:TextMate有一个Ruby方法! TextMate.app/Contents/SharedSupport/Support/lib#e_sh

答案 2 :(得分:1)

您可以使用“escape”库进行shell转义,或者使用exec并将数组传递给它 - 如果这样做,exec将使用SafeStringValue()宏自动转义< / p>