使用零格式打印ruby数组

时间:2017-04-04 07:48:57

标签: arrays ruby configuration-files put

我有以下一些代码来创建一个IP地址数组,我只打印出一个匹配模式的代码。

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

我正在尝试将该IP地址写入这样的配置文件

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

输出:

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

如何在没有引号和括号的情况下将此值正确写入文件?

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

我已经尝试过把它们搞定了,但那对我不起作用。

1 个答案:

答案 0 :(得分:4)

你得到“引号和括号”因为grep返回一个数组。要解决此问题,您可以打印单个元素:(请参阅mudasobwa's comment

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

或者您可以更改代码以仅返回与模式匹配的第一个地址:

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

并通过以下方式打印:

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

我总是想要10.0.128|129|0.*形式的地址。实际上,我正在做的就是我的正则表达式。 grep(/10.0.(128|129|0).*/)

你必须逃避点(\.)或将它们放在一个字符类([.])中。否则,单个.将匹配任何字符。此外,您还应该匹配字符串的开头(^)和结束($)以避免匹配210.0.0.1。更坚固的Regexp可能如下所示:

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

或者,有Ruby的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