2014-11-21 66 views
0

想知道是否可以幫助重新格式化數組中的某些元素,以便以某種方式輸出它們。這是我到目前爲止有:要重新格式化紅寶石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,因爲我今天的嘗試甚至還沒有接近。

+0

什麼是'節點'爲您的cu rrent輸出和你想要什麼? – 2014-11-21 21:39:22

+0

當您提出有關格式化數據的問題時,請提供您的輸入數據示例,而不是讓我們發明它。 – 2014-11-22 06:50:27

回答

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" 
+0

你的第二塊就是我正在尋找的。非常感謝!是的,你的懷疑是正確的...我正在尋找json格式輸出。 – PurrBiscuit 2014-11-22 00:06:21