Ruby中如何转义反斜杠以生成正确的bash命令?
问题描述
我在Ruby中有如下哈希:
{"metric"=>"Mean F-Score", "columns"=> [{"name"=>"Id", "type"=>"String"}, {"name"=>"Expected", "type"=>"String"}], "files"=> {"expected"=>"actual_output.csv"}, "submission_filename"=>"/a/aa/submission.csv"}
通过JSON.generate生成对应的JSON字符串:
irb(main):101:0> json_string = JSON.generate(a) => "{\"metric\":\"Mean F-Score\",\"columns\":[{\"name\":\"Id\",\"type\":\"String\"},{\"name\":\"Expected\",\"type\":\"String\"}],\"files\":{\"expected\":\"actual_output.csv\"},\"submission_filename\":\"/a/aa/submission.csv\"}"
我想要生成一条bash命令,将该JSON字符串写入data.json文件,尝试了如下代码:
irb(main):104:0> "echo \"#{json_string}\" > data.json" => "echo \"{\"metric\":\"Mean F-Score\",\"columns\":[{\"name\":\"Id\",\"type\":\"String\"},{\"name\":\"Expected\",\"type\":\"String\"}],\"files\":{\"expected\":\"actual_output.csv\"},\"submission_filename\":\"/a/aa/submission.csv\"}\" > data.json"
但执行该bash命令后生成了错误的JSON文件。需要生成可在不同服务器运行的正确命令,期望得到的命令格式如下:
echo "{\"metric\":\"Mean F-Score\",\"columns\":[{\"name\":\"Id\",\"type\":\"String\"},{\"name\":\"Expected\",\"type\":\"String\"}],\"files\":{\"expected\":\"actual_output.csv\"},\"submission_filename\":\"/a/aa/submission.csv\"}" > data.json
请问如何在Ruby中转义反斜杠以实现这一需求?
解决方法
要生成符合要求的bash命令,核心是让Ruby输出的字符串中,JSON里的双引号能被bash正确识别,需要对特殊字符做二次转义,这里有两种可靠的实现方式:
方式一:手动替换转义字符
直接对生成的json_string做字符串替换,把原有的双引号转义为\",同时把原有的反斜杠转义为\\,插入到bash命令模板后就能得到正确格式:
# 对JSON字符串中的双引号和反斜杠做二次转义 escaped_json = json_string.gsub('"', '\\"').gsub('\\', '\\\\') # 拼接bash命令 bash_command = "echo \"#{escaped_json}\" > data.json"
执行这段代码后,bash_command的值就是你期望的正确bash命令。
方式二:使用Shellwords库自动转义(推荐)
Ruby标准库中的Shellwords提供了专门的shell转义方法,能自动处理所有shell特殊字符,比手动替换更可靠,兼容性也更强:
# 先引入Shellwords库 require 'shellwords' # 直接用shellescape方法处理JSON字符串,再拼接命令 bash_command = "echo #{json_string.shellescape} > data.json"
这种方法不仅能处理双引号和反斜杠,还能应对JSON中可能出现的空格、特殊符号等,生成的命令可以在不同服务器环境稳定运行。
内容的提问来源于stack exchange,提问作者sankalp
相关产品推荐
相关产品推荐

