[英]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
我已經嘗試過將它們替換掉,但這對我沒有用。
您會得到“引號和方括號”,因為grep
返回一個數組。 要解決此問題,您可以打印一個元素:(請參見mudisobwa的評論 )
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.