多行正则表达式并输出到 Windows 中的文件

发布于 2024-07-14 03:45:40 字数 623 浏览 10 评论 0原文

我有一个日志文件,需要从中提取特定模式。 我需要找到它们然后将它们处理到一个新文件中。 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 上执行此操作?

我希望有一个我没有想到的简单解决方案。 我宁愿留在 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:

  1. Is there an easy utility to accomplish this, on any system?
  2. 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

要走就滚别墨迹 2024-07-21 03:45:40

这是 awkperl有状态解析的良好候选者(这些将在 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's CMD.EXE, provided you have perl and/or awk/sed in your PATH, 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

╭ゆ眷念 2024-07-21 03:45:40

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

You could install Perl or Python or Ruby or PHP and write the script fairly easily.

星軌x 2024-07-21 03:45:40

感谢所有的答案。 我喜欢你给我的关于 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
}

,我可以通过 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

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
}

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文