2017-04-04 4 views
0

Ich habe das folgende Bit Code, um ein Array von IP-Adressen zu machen, und ich drucke nur eines aus, das einem Muster entspricht. wie dieseDrucken eines Ruby-Arrays mit Null-Formatierung

ip_address = node.network.interfaces.map { |p, f| f[:addresses].keys }.flatten.delete_if{|x| x =~ /(.*):(.*)/ }.grep(/127/) 

Ich versuche, zu einer Konfigurationsdatei

bind "#{ip_address}:22002 ssl crt /etc/ssl/certs/wildcard.example.com.pem" 

Ausgabe, die IP-Adresse dann schreiben: in eine Datei

bind ["127.0.0.1"]:22002 ssl crt /etc/ssl/certs/wildcard.example.com.pem 

Wie kann ich diesen Wert richtig schreiben, ohne die Anführungszeichen und Klammern?

bind 127.0.0.1:22002 ssl crt /etc/ssl/certs/wildcard.example.com.pem 

Ich habe versucht, sie auszugeben, aber das funktioniert nicht für mich.

+2

'bind„# {ip_address.first}: 22002 ssl crt/etc/ssl/certs/Wildcard. example.com.pem "' – mudasobwa

+0

Das hat funktioniert, danke! Ich konnte # {puts ip_address} in irb arbeiten, aber in Wirklichkeit war es nicht seltsam. –

+0

@Brando__ Ihr passender Code kann wahrscheinlich verbessert werden. Welche IP-Adresse möchten Sie auswählen? – Stefan

Antwort

4

Sie erhalten die "Anführungszeichen und Klammern", weil grep ein Array zurückgibt. Um es zu beheben, können Sie entweder ein einzelnes Element drucken: (siehe mudasobwa's comment)

bind "#{ip_address.first}:22002 ssl crt /etc/ssl/certs/wildcard.example.com.pem" 

Oder Sie könnten den Code ändern, dass nur die erste Adresse passend zum Muster zurück:

ip_addresses = node.network.interfaces.flat_map { |_, f| f[:addresses].keys } 
ip_address = ip_addresses.find { |x| x !~ /(.*):(.*)/ && x =~ /127/ } 

und drucken Sie es über :

bind "#{ip_address}:22002 ssl crt /etc/ssl/certs/wildcard.example.com.pem" 

ich möchte immer die Adresse in Form von 10.0.128|129|0.*. In Wirklichkeit mache ich das als meine Regex. grep(/10.0.(128|129|0).*/)

Sie haben die Punkte zu entkommen (\.) oder sie in einer Zeichenklasse setzen ([.]). Andernfalls wird ein einzelnes . mit ein beliebiges Zeichen übereinstimmen. Außerdem sollten Sie den Anfang (^) und das Ende ($) des Strings anpassen, um eine Übereinstimmung mit 210.0.0.1 zu vermeiden. Eine solidere Regexp könnte wie folgt aussehen:

/^10\.0\.(128|129|0)\.\d{1,3}$/ 

Alternativ gibt es Rubys IPAddr:

require 'ipaddr' 

valid_ips = [ 
    IPAddr.new('10.0.0.0/24'), 
    IPAddr.new('10.0.128.0/24'), 
    IPAddr.new('10.0.129.0/24') 
] 

valid_ips.any? { |net| net.include? '127.0.0.1' } #=> false 
valid_ips.any? { |net| net.include? '10.0.128.1' } #=> true 
valid_ips.any? { |net| net.include? '8.8.8.8' } #=> false