簡體   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