想知道我是否可以帮助重新格式化数组中的某些元素,以便以某种方式输出它们。这是我到目前为止所做的:
node = gets.chomp
nodelist = `knife node list`
if nodelist.include?(node)
cookbook_versions = `knife solve -n #{node}`.split(/\n/).drop(1)
cookbook_versions.collect!{|element| element.gsub!(#regexhere)}
puts cookbook_versions
else
puts "not found"
end
目前输出:
7-zip 1.0.2
apache2 2.0.0
apt 2.6.0
ark 0.9.0
我希望它看起来像这样:
"7-zip": "1.0.2",
"apache2": "2.0.0",
"apt": "2.6.0",
"ark": "0.9.0"
任何人都知道一些可以帮助我做到这一点的正则表达式吗?或任何其他方式?我把#regexhere放在上面的代码中是因为我今天到目前为止的尝试还没有结束。
答案 0 :(得分:0)
你有一系列像
这样的行["7-zip 1.0.2", "apache2 2.0.0"]
并希望将它们转换为键值列表(尽管我怀疑你真的想要json)。
node = gets.chomp
nodelist = `knife node list`
if nodelist.include?(node)
cookbook_versions = `knife solve -n #{node}`.split(/\n/).drop(1).map {|line| line.split(" ", 2) }
puts JSON.pretty_generate Hash[*cookbook_versions.flatten]
else
puts "not found"
end
通过示范:
# Given:
x = ["apache2 1.9.6", "iptables 0.12.0", "logrotate 1.5.0", "pacman 1.1.1"]
> puts JSON.pretty_generate Hash[*x.flat_map {|line| line.split(" ", 2) }]
{
"apache2": "1.9.6",
"iptables": "0.12.0",
"logrotate": "1.5.0",
"pacman": "1.1.1"
}
如果你想要它没有括号,你可能只想迭代并手动显示列表:
if nodelist.include?(node)
cookbook_versions = `knife solve -n #{node}`.split(/\n/).drop(1).map {|line| line.split(" ", 2)
puts cookbook_versions.map {|line| format('"%s": "%s"', *line) }.join(",\n")
else
puts "not found"
end
输出:
"apache2": "1.9.6",
"iptables": "0.12.0",
"logrotate": "1.5.0",
"pacman": "1.1.1"