MultiLine Regular Expression并输出到Windows中的文件

时间:2009-02-21 03:37:26

标签: windows regex utilities

我有一个日志文件,我需要从中提取特定的模式。我需要找到然后将它们处理成一个新文件。 Linux上的grep通常可以解决问题,但正则表达式跨越多行,我理解grep不会这样做。

这是我的日志/调试文件中的一个示例:


Da:
1.328   0.5045  

Db:
0.6415  0.1192  

Lambda:
0.4429  -0.35   
-0.0461 -0.02421    

seps:
0.714272

我正在寻找/Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/我想要将这些行输出到一个新文件中,删除lambda并将数字重新排列到同一行,这样输出\1\s\2\s\3\s\4\n

所以我实际上有两个问题:

  1. 在任何系统上都有一个简单的实用工具吗?
  2. 有没有办法专门在Windows上执行此操作?
  3. 我希望有一个简单的解决方案可以逃脱我。我宁愿留在窗口,但如果我必须去Linux,我会完成这件事。

3 个答案:

答案 0 :(得分:1)

这是awkperl以及类似有状态解析的良好候选者(如果您拥有{CMD.EXE,这些将在Windows的perl中运行您awk/sed中的1}}和/或PATH,当然还有Linux和其他unices上的内容:

awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file >output_file

perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file >output_file


如果需要,您可以执行第二次传递以规范化空格(并在线的末尾修剪空白)。

awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file | sed -e "s: *: :g" -e "s: *$::" >output_file

perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda && /^ *$/) { $in_lambda=0 ; printf \"\n\" } elsif ($in_lambda) { printf \"%s \", $_ }" input_file | perl -ne "s/ +/ /g; s/ +$//g; print" >output_file

答案 1 :(得分:0)

您可以安装Perl或Python或Ruby或PHP并轻松编写脚本。

答案 2 :(得分:0)

感谢所有答案。我喜欢你给我的perl和awk的答案。我是那些不懂perl的奇怪程序员之一,所以我选择了ruby路线。这是我的解决方案

x=ARGV[0]
f=File.new(ARGV[1])
g=File.new(ARGV[2],"w")
f.read.gsub(/#{x}:\s*(([\d\.\-]*\t*)+\n)+/ ){|entry|
    puts entry
    g.puts entry.gsub(/#{x}:\n/,'').gsub(/\s+/,"\t").strip
}

据我所知,我可以使用我的编辑器Notepad ++通过NppExec作为实用程序,它不支持重定向和管道。这也允许我收集我需要通过程序诊断的任何输出。再次感谢你们。