2014-01-14 43 views
1

我想要的文本块添加到输出文件,使用:如何使用范围(..)运算符查找从“字符串”到“ n n”的行?

File.foreach("#{options[:source]}") do |li| 
    if (li['Exception:'] .. li["\n\n"]) then 
      bufferBlocks.push(li) 
    end 
end 

一个例子的例外可能是:

#^^ log continues prior to this ^^ 
words .. words .. words 
words .. words .. words 

words .. words .. words 
words .. words .. words 

Exception: ERROR 50001 
File: source.cpp 
Line: 221 
Msg: Encountered unknown server error! 

words .. words .. words 
words .. words .. words 

words .. words .. words 
#\/ log continues below this \/ 

和所有我想在我的输出是块:

Exception: ERROR 50001 
File: source.cpp 
Line: 221 
Msg: Encountered unknown server error! 

回答

2

我明白你在做什么。请务必记住,每个“li”只是一行代码,并以“\ n”结尾,因此您必须查找“\ n”而不是“\ n \ n”。我还没有尝试过,但是这应该工作:

File.foreach(filename) do |li| 
    if (li.start_with? "Exception:") ... (li == "\n") 
     bufferBlocks.push(li) 
    end 
end 

我找不到它的任何好的文档,但我想它被称为触发器(感谢bjhaid)。如果Ruby看到在“if”的那部分内使用范围文字,那么它会非常特别地对待它。范围的第一部分只需要一些代码,当你想让条件(触发器)开始为真时,它将返回true。同样,范围的第二部分告诉Ruby何时该条件应该停止为真。

顺便说一句,你可以做到同样的事情用一个简单的局部变量:

in_exception = false 
File.foreach(filename) do |li| 
    if in_exception 
     in_exception = !(li == "\n") 
    else 
     in_exception = (li.start_with? "Exception:") 
    end 

    if in_exception 
     bufferBlocks.push(li) 
    end 
end 
+1

你介意解释这是如何工作的吗? – MrDuk

+4

其在红宝石和扫描日志文件中的被称为触发器是少数几个地方你会用红宝石触发器 – bjhaid

+0

我给我的答案添加了一个解释。 –

1

假设li由含有输入的字符串,可以做到这一点:

li.scan(/Exception: .*?\nFile: .*?\nLine: .*?\nMsg: .*?$/m) 

它返回所有出现的数组。在你的例子中:

["Exception: ERROR 50001\nFile: source.cpp\nLine: 221\nMsg: Encountered unknown server error!"] 
+0

我已经更新了我的文章更准确 - 有“N \ n \”整个的多个实例登录。 – MrDuk

+0

我更新了答案 – mechanicalfish

相关问题