繁体   English   中英

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

[英]Escaping a Ruby String for TextMate's $DIALOG command

称呼正则表达式大师。 我现在在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调用将转义我放入参数中的字符串。 因此,假设我的参数是在运行时查找的,这是我认为我需要使用上面的相同示例进行的操作:

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样式有助于避免忘记转义所有引号,但是参数仍然存在问题,因此我要求使用字符串操作和正则表达式的人比我更愿意填写该字符串方法。 我将不胜感激! :)

String.inspect将以使shell满意的方式转义定界符等:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM