使用零格式打印 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
我有以下代码来制作一组 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