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

我有一个小脚本来自动化YAML文件中的一些东西。

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

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

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

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

这是@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从输出文件中删除出现的魔术字符串。

这非常有效。 我是从这里得到的

 require 'psych' ast = Psych.parse_stream DATA.read # First pass, quote everything ast.grep(Psych::Nodes::Scalar).each do |node| node.plain = false node.quoted = true node.style = Psych::Nodes::Scalar::DOUBLE_QUOTED end # Second pass, unquote keys ast.grep(Psych::Nodes::Mapping).each do |node| node.children.each_slice(2) do |k, _| k.plain = true k.quoted = false k.style = Psych::Nodes::Scalar::ANY end end puts ast.yaml 

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

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

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

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