2

我需要使用正则表达式提取元素。

首先我从一个函数读取一个文件,然后从第二个函数读取另一个文件并提取一个值。

在处理第二个函数的读取时,我从第一个文件中 grep 值:

#function read file
def get_file_as_string(filename)
  data = ''
  f = File.open(filename, "r") 
  f.each_line do |line|
    data += line
  end
  return data
end

主要的:

file.each do |filename|
  lunsrvfile = 'server_lun.csv'
  ldev = get_file_as_string lunsrvfile
  f=File.read(filename)
  lunid = f.scan(/^"No.","time","(\h+:\h+:\h+).*/).flatten  #it's ok:  ex: 00:02:00
       if (ldev =~ /#{lunid}/) then
           server = ldev.lines.grep(lunid) #--> don't work
           #server = %x[grep lunid 'server_lun.csv' |awk -F ";" '{print $1}'] #--> don't work
           puts filename
           puts lunid
           puts server
    end
end

server_lun.csv:

server1;00:02:00
server2;00:03:25
server3;00:03:26

谢谢你的回答:

是的,我已经测试过了,但是当我把

server = ldev.lines.grep(/#{lunid}/)

列出了所有文件(lunsrvfile)。

如果匹配,我需要第一个值:例如 server1

谢谢你的回答2:

但有:

server = ldev.grep(/#{lunid}/).first.split(';').first

只有第一个 server1 是打印的。

输出:

filename1
lunid1
server1

filename2
lunid2
server1
(...)
4

2 回答 2

1

grep需要一个正则表达式,你传递给它一个字符串。对命令执行的方式与您=~grep命令执行的方式相同。此外,您不需要实施get_file_as_string. 顶部的一个衬垫将为您完成。

我认为这会做你想要的:

lunsrvfile = 'server_lun.csv'
ldev = File.open(lunsrvfile, "rb").read

file.each do |filename|
  f = File.read(filename)
  lunid = f.scan(/^"No.","time","(\h+:\h+:\h+).*/).flatten  #it's ok:  ex: 00:02:00
  if (ldev =~ /#{lunid}/) then
    server = ldev.lines.grep(/#{lunid}/)
    puts filename
    puts lunid
    puts server
  end
end
于 2013-03-19T17:17:20.613 回答
0

您可以通过这种方式将文件读入数组

ldev = IO.readlines lunsrvfile

然后

ldev.grep /#{lunid}/

将只返回该服务器的字符串

要获取服务器名称,您可以尝试例如:

ldev.grep(/#{lunid}/).first.split(';').first
于 2013-03-19T17:32:16.967 回答