Многострочное регулярное выражение и вывод в файл в Windows

StackOverflow https://stackoverflow.com/questions/572110

  •  05-09-2019
  •  | 
  •  

Вопрос

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

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

Другие советы

Это хороший кандидат на awk, perl и тому подобное синтаксический анализ с учетом состояния (они будут запускаться в обоих окнах CMD.EXE, при условии , что у вас есть perl и/или awk/sed в вашем 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top