我有一个日志文件,我需要从中提取特定的模式。我需要找到然后将它们处理成一个新文件。 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
所以我实际上有两个问题:
我希望有一个简单的解决方案可以逃脱我。我宁愿留在窗口,但如果我必须去Linux,我会完成这件事。
答案 0 :(得分:1)
这是awk
,perl
以及类似有状态解析的良好候选者(如果您拥有{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作为实用程序,它不支持重定向和管道。这也允许我收集我需要通过程序诊断的任何输出。再次感谢你们。