我有以下一些代码来创建一个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
我已经尝试过把它们搞定了,但那对我不起作用。
答案 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