要重新格式化的Ruby gsub数组元素

时间:2014-11-21 21:31:38

标签: ruby arrays regex gsub

想知道我是否可以帮助重新格式化数组中的某些元素,以便以某种方式输出它们。这是我到目前为止所做的:

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放在上面的代码中是因为我今天到目前为止的尝试还没有结束。

1 个答案:

答案 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"