转储YAML时如何强制使用双引号?

时间:2013-08-19 14:29:35

标签: ruby yaml

我有一个小脚本可以自动化YAML文件中的某些内容。

我读取原始的YAML文件并将其转换为哈希值,然后在修改后将dump文件转换为该文件:

File.open(output_file, "w") do |out|
  YAML.dump(modified_hash, out)
end

工作正常,但如果不需要,它会删除字符串周围的双引号。这是有效的YAML,但看起来不太好。

我可以在每个字符串的末尾添加一个空格来强制使用单引号,但我对此并不满意。有没有办法在字符串周围强制使用双引号?

2 个答案:

答案 0 :(得分:1)

这是@ jomo答案的Ruby版本,供任何人未来参考:

def ensure_quotes(h)
  h.each do |k, v|
    if v.is_a?(Hash)
      ensure_quotes(v)
      next
    end
    h[k] = v + "__ensure_quotes__\n "
  end
end

def dump_yaml_with_double_quotes(yaml_file)
  yaml = YAML.load_file(yaml_file)
  File.open(yaml_file, 'w') do |f|
    YAML.dump(ensure_quotes(yaml), f, line_width: -1)
  end
  `sed -i '' "s/__ensure_quotes__[\\]n //g" #{yaml_file}`
end

从文件加载YAML,以递归方式将魔术引号字符串附加到YAML对象中的所有值,然后将该YAML转储到同一文件,然后使用sed删除魔术字符串的出现来自输出文件。

答案 1 :(得分:0)

我找到了一个解决方案,这很奇怪,但它确实有用。

要强制单引号,我浏览了哈希并将"foobar "(注意空格)附加到每个值。使用YAML.dump后,我再次打开文件并用空字符串替换"foobar "

要强制双引号,我发现附加"foo \nbar"可以完成这项工作。然后,我再打开文件并用空字符串替换"foo \\nbar"。很奇怪,但有效。

请注意,您可能希望选择比foobar更少使用的东西。