多行正则表达式并输出到 Windows 中的文件
我有一个日志文件,需要从中提取特定模式。 我需要找到它们然后将它们处理到一个新文件中。 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
所以我实际上有两个问题:
- 在任何系统上是否有一个简单的实用程序可以完成此任务?
- 有没有办法专门在 Windows 上执行此操作?
我希望有一个我没有想到的简单解决方案。 我宁愿留在 Windows,但如果我必须使用 Linux,我会完成这件事。
I have an log file that I need to extract specific patterns from. I need to find and then process them into a new file. grep on Linux would usually do the trick but the regular expression spans multiple lines, which I understand grep does not do.
here is an example from my log/debug file:
Da:
1.328 0.5045
Db:
0.6415 0.1192
Lambda:
0.4429 -0.35
-0.0461 -0.02421
seps:
0.714272
I'm looking for /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/
I then want to output the lines to a new file removing the lambda and rearrange the numbers onto the same line so output \1\s\2\s\3\s\4\n
So I have actually two questions:
- Is there an easy utility to accomplish this, on any system?
- Is there a way to do this specifically on windows?
I'm hoping there is a simple solution to this that has escaped me. I would rather stay in windows but if I have to go to Linux I will to get this done.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是
awk
、perl
等有状态解析的良好候选者(这些将在 Windows 的CMD.EXE,前提是您的
PATH
中有perl
和/或awk/sed
,当然,在 Linux 和其他 unice 上也是如此):awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" 输入文件 > 输出文件
或
perl -ne "chomp; if (/^Lambda/) { $in_lambda = 1 } elsif ($in_lambda & & /^ *$/) { $in_lambda=0 ; } 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; 打印" >输出文件
This is a good candidate for
awk
,perl
and the like stateful parsing (these will run in both Windows'sCMD.EXE
, provided you haveperl
and/orawk/sed
in yourPATH
, as well as, of course, on Linux and other unices):awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file >output_file
or
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
You can perform a second pass to normalize whitespace (and trim whitespace at the end of the lines) if needed.
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
or
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
您可以安装 Perl 或 Python 或 Ruby 或 PHP 并相当轻松地编写脚本。
You could install Perl or Python or Ruby or PHP and write the script fairly easily.
感谢所有的答案。 我喜欢你给我的关于 perl 和 awk 的答案。 我是那些不懂 Perl 的奇怪程序员之一,所以我选择了 ruby 路线。 这是我的解决方案
,我可以通过 NppExec 将其用作编辑器 Notepad++ 的实用程序,据我所知,它不支持重定向和管道。 这也允许我收集我需要通过程序诊断的任何输出。 再次谢谢大家。
thanks for all the answers. I like the answers you gave me for the perl and awk. I'm one of those weird programmers that doesn't know perl, so I took the ruby route. here is my solution
this I can use as a utility with my editor Notepad++ through NppExec, which does not support redirect and piping, as far as I know. This also allows for me to collect any of the output that I need to diagnose by program. Thanks again y'all.