转储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更少使用的东西。
- 如何以智能方式从多维数组中“提取”值?
- RoR – 放置自动化流程的位置
- 我可以直接从routes.rb渲染布局,没有控制器吗?
- 我们如何validationSequel.connect是否在Rails中打开了我们的SQLite3数据库?
- rake db:migrate在通过RVM升级ruby 2.2.2到2.2.3之后不起作用
- 使用ruby生成为/ etc / shadow格式化的SHA512 crypt-style哈希?
- 在rails上的ruby中创建一个列表框
- Rails + PostgreSQL SSL解密失败
- 带有(class_eval,define_method)vs(instance_eval,define_method)的Ruby单例方法