2009-02-21 2 views
0

У меня есть файл журнала, в котором мне нужно извлечь определенные шаблоны. Мне нужно найти, а затем обработать их в новый файл. grep на Linux обычно выполняет трюк, но регулярное выражение охватывает несколько строк, которые я понимаю, grep не делает.MultiLine Regular Выражение и вывод в файл в окнах

вот пример из моего файла журнала/отладки:


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. Есть ли способ сделать это специально для окон?

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

ответ

0

спасибо за ответы на все вопросы. Мне нравятся ответы, которые вы мне дали для perl и awk. Я один из тех странных программистов, которые не знают perl, поэтому я взял рубиновый маршрут. вот мое решение

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

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

1

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

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

Смежные вопросы