6

YAML ファイルでいくつかのことを自動化するための小さなスクリプトがあります。

元の YAML ファイルを読み取ってハッシュに変換し、変更後にファイルにダンプします。

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

これは問題なく動作しますが、文字列を囲む二重引用符が不要な場合は削除されます。これは有効な YAML ですが、見栄えがよくありません。

すべての文字列の最後にスペースを追加して、単一引用符を強制することもできますが、それではあまり満足できません。文字列を二重引用符で囲む方法はありますか?

4

3 に答える 3

0

将来の参考のために、@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して出力ファイルからマジック文字列を削除します。

于 2015-09-18T20:35:08.387 に答える
0

私は解決策を見つけました、それは奇妙ですが、うまくいきます。

一重引用符を強制するために、ハッシュを調べて、"foobar "すべての値に (スペースに注意してください) を追加しました。を使用した後YAML.dump、ファイルを再度開き、"foobar "空の文字列に置き換えました。

二重引用符を強制するには、追加するとうまくいくことがわかりました"foo \nbar"。もう一度、ファイルを開き、"foo \\nbar"空の文字列に置き換えます。奇妙ですが、動作します。

おそらく、foobar よりも使用される可能性が低いものを選択する必要があることに注意してください。

于 2013-08-20T12:43:38.977 に答える