使用零格式打印 ruby 数组

Printing a ruby array with zero formatting

我有以下代码来制作一组 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

我试过将它们 gsubbing 出来,但这对我不起作用。

你得到 "quotes and brackets" 因为 grep return 是一个数组。要修复它,您可以打印单个元素:(参见

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

或者您可以将代码更改为 return 只有与模式匹配的第一个地址:

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"

I always want the address in the form of 10.0.128|129|0.*. In reality what I'm doing is this as my regex. grep(/10.0.(128|129|0).*/)

您必须转义点 (\.) 或将它们放在字符 class ([.]) 中。否则,单个 . 将匹配 任何字符 。此外,您还应该匹配字符串的开头 (^) 和结尾 ($),以避免匹配 210.0.0.1。更可靠的正则表达式可能如下所示:

/^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