MultiLine Regular Выражение и вывод в файл в Windows - PullRequest
0 голосов
/ 21 февраля 2009

У меня есть файл журнала, из которого мне нужно извлечь определенные шаблоны. Мне нужно найти, а затем обработать их в новый файл. grep в Linux обычно делает свое дело, но регулярное выражение занимает несколько строк, что, как я понимаю, не делает 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\.]+)/ Затем я хочу вывести строки в новый файл, удаляя лямбду, и переставить числа в одну строку, чтобы вывести \1\s\2\s\3\s\4\n

Итак, у меня есть два вопроса:

  1. Существует ли простая утилита для достижения этой цели в любой системе?
  2. Есть ли способ сделать это специально для Windows?

Я надеюсь, что есть простое решение, которое ускользнуло от меня. Я бы предпочел остаться в Windows, но если мне придется перейти на Linux, я сделаю это.

Ответы [ 3 ]

1 голос
/ 21 февраля 2009

Это хороший кандидат для awk, perl и т. П. синтаксический анализ состояния (они будут работать как в Windows CMD.EXE, если у вас есть perl и / или awk/sed в вашем PATH, а также, конечно, в Linux и других приложениях):

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

0 голосов
/ 02 марта 2009

спасибо за все ответы. Мне нравятся ответы, которые вы дали мне за 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, который, насколько я знаю, не поддерживает перенаправление и конвейерную передачу. Это также позволяет мне собирать любые выходные данные, которые мне нужно диагностировать программой. Еще раз спасибо вам.

0 голосов
/ 21 февраля 2009

Вы можете установить Perl или Python, Ruby или PHP и написать скрипт довольно легко.

...