这是我的Ruby代码:
#!/usr/bin/env ruby
require 'socket'
third_way=Socket.ip_address_list.select{|intf| intf.ipv4?}
#the above variable is an **array**
puts "%s" % ["With Percent S Percent #{third_way}"]
puts ["Nothing fancey. Straight puts... #{third_way}"]
third_way.each do |ip|
puts "%s" % ["gsub1 #{ip}"].gsub(/[<>\[\]]/, "")
puts "%s" % ["gsub2 #{ip}"].gsub("<>[]", "")
end
输出:
With Percent S Percent [#<Addrinfo: 127.0.0.1>, #<Addrinfo: 192.168.252.54>]
Nothing fancey. Straight puts... [#<Addrinfo: 127.0.0.1>, #<Addrinfo: 192.168.252.54>]
./myip.rb:36:in `block in <main>': undefined method `gsub' for #<Array:0x000000010cdbf8 (NoMethodError)
from ./myip.rb:35:in `each'
from ./myip.rb:35:in `<main>'
这是我的bash代码
#!/usr/bin/env bash
array=("[#<Addrinfo: 127.0.0.1>, #<Addrinfo: 192.168.0.4>]")
IFS_OLD="$IFS"
IFS=","
for ip in $array; do
echo "$ip" | awk '{print $2}' | sed "s/>.*//g"
done
IFS="$IFS_OLD"
输出:
127.0.0.1
192.168.0.4
现在提出我的问题。我怎么做我在bash中做的事,用红宝石?
我似乎无法在红宝石中使用它,而在bash中,它很容易就行了!
答案 0 :(得分:3)
我不是红宝石专家,但这有效:
#!/usr/bin/env ruby
str = "[#<Addrinfo: 127.0.0.1>, #<Addrinfo: 192.168.0.4>]"
puts str.scan(/(?<=: )[\d.]+(?=>)/)
正则表达式可能更简单,但我使用了正向前瞻和后向断言来确保遵循IP地址并且前面有正确的字符。
顺便说一下,你可以用bash来解决这个问题:
#!/bin/bash
string="[#<Addrinfo: 127.0.0.1>, #<Addrinfo: 192.168.0.4>]"
awk -F': |>' -v RS=, '{print $2}' <<<"$string"
这使用自定义输入字段分隔符和记录分隔符将字符串拆分为必填字段。
输出(无论哪种方式):
127.0.0.1
192.168.0.4
答案 1 :(得分:1)
所以这是我的结果代码。
#!/usr/bin/env ruby
require 'socket'
puts Socket.ip_address_list.select{|intf| intf.ipv4?}.to_s.scan(/(?<=: )[\d.]+(?=>)/)
#or we can break it up a bit more.
ip_arr = Socket.ip_address_list.select{|intf| intf.ipv4?}
puts ip_arr.to_s.scan(/(?<=: )[\d.]+(?=>)/)
输出:
127.0.0.1
192.168.0.4
将数组转换为字符串需要to_s
。
在转换之后,我选择了Tom Fenech,因为它避免了循环。
那个awk声明非常聪明。
谢谢你们!
答案 2 :(得分:1)
Ruby也可以从bash做同样的事情:)
#!/usr/bin/env bash
$ echo "[#<Addrinfo: 127.0.0.1>, #<Addrinfo: 192.168.0.4>]" | ruby -ne
'$_.gsub(/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/).each{|x| puts x}'
答案 3 :(得分:1)
在红宝石中保持简单:
var = "[#<Addrinfo: 127.0.0.1>, #<Addrinfo: 192.168.0.4>]"
puts var.scan(/\d+\.\d+\.\d+\.\d+/).join("\n")
在bash中使用grep:
grep -Po '\d+\.\d+\.\d+\.\d+' <<< '[#<Addrinfo: 127.0.0.1>, #<Addrinfo: 192.168.0.4>]'
两个输出:
127.0.0.1
192.168.0.4
答案 4 :(得分:0)
<强>代码:强>
#!/usr/local/bin/ruby
var = "[#<Addrinfo: 127.0.0.1>, #<Addrinfo: 192.168.0.4>]"
var.split.each do |y|
puts y.gsub(/>|,|\]/, '') unless y =~ /Addr/
end
### Or, you can write above loop in shorthand notation as:
### var.split.each {|y| puts y.gsub(/>|,|\]/, '') unless y =~ /Addr/}
<强>输出:强>
127.0.0.1
192.168.0.4