多行文件grep

时间:2017-10-24 23:58:28

标签: ruby grep multiline

我有一个包含这样的部分的文件,

flags...id, description, used, color
AB, "Abandoned", 0, 13168840
DM, "Demolished", 0, 15780518
OP, "Operational", 0, 15780518...

其中...表示一系列控制字符,例如ETX和STX。我试图从文件中抓取多行。

我使用以下代码:

f = File.open(somePath)
r = f.grep(/flags.+id, description, used, color(?<data>(?:.|\s)*?)[\x00-\x08]/)

此代码不起作用。我不懂为什么。 grep的文档似乎暗示该文件是逐行解析的。我觉得这可能是正则表达式没有返回任何结果的原因。

  1. 我是否认为grep使用逐行解析?这就是我的正则表达不按预期工作的原因吗?
  2. 使用file.each_line捕获数据会更好吗?
  3. 是否有更好/更清洁的替代方案?

3 个答案:

答案 0 :(得分:1)

String#scan来救援:

File.read('/path/to/file').scan(
  /flags.+id, description, used, color(?<data>(?:.|\s)*?)[\x00-\x08]/m
)

答案 1 :(得分:0)

您需要启用多线模式。 <{1}}默认情况下与新行不匹配。

来自文档https://ruby-doc.org/core-2.1.1/Regexp.html

.

答案 2 :(得分:0)

  

我是否认为grep使用逐行解析?

是。试试你的文件:

r = File.open(somePath) do |f|
  f.grep(/[A-Z]{2},/)
end

puts r
# => AB, "Abandoned", 0, 13168840
#    DM, "Demolished", 0, 15780518
#    OP, "Operational", 0, 15780518

puts r.inspect
# => ["AB, \"Abandoned\", 0, 13168840\n", "DM, \"Demolished\", 0, 15780518\n", "OP, \"Operational\", 0, 15780518\n"]
  

这就是我的正则表达不按预期工作的原因吗?

不仅如此。你在寻找什么,[\ x00- \ x08]? ascii或十六进制字符?

  

使用file.each_line捕获数据会更好吗?

File#grep听起来不错。