Multiline Regular Expression und in Fenster in eine Datei ausgibt
Frage
Ich habe eine Log-Datei, die ich brauche von spezifischen Muster zu extrahieren. Ich brauche zu finden und sie dann in eine neue Datei zu verarbeiten. grep auf Linux würde in der Regel den Trick tun, aber der reguläre Ausdruck erstreckt sich über mehrere Zeilen, die ich grep versteht nicht tun.
Hier ist ein Beispiel aus meinem Log / Debug-Datei:
Da:
1.328 0.5045
Db:
0.6415 0.1192
Lambda:
0.4429 -0.35
-0.0461 -0.02421
seps:
0.714272
Ich suche nach /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/
ich dann ausgegeben werden sollen die Linien in eine neue Datei, die Lambda-Entfernung und die Zahlen auf der gleichen Linie so Ausgabe \1\s\2\s\3\s\4\n
neu ordnen
Also ich habe eigentlich zwei Fragen:
- Gibt es eine einfache Dienstprogramm, dies zu erreichen, auf jedem System?
- Gibt es eine Möglichkeit, dies auf Windows speziell zu tun?
Ich hoffe es eine einfache Lösung für dieses Problem ist, die mir entgangen ist. Ich würde lieber in den Fenstern bleiben, aber wenn ich zu Linux gehen werde ich dies getan.
Lösung 3
Danke für alle Antworten. Ich mag die Antworten, die Sie mir für die Perl und awk gab. Ich bin einer jener seltsamen Programmierer, die nicht Perl nicht kennt, so nahm ich den Rubin Weg. hier ist meine Lösung
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
}
das ich als Dienstprogramm mit meinem Editor Notepad ++ durch NppExec verwenden kann, die nicht Redirect und Leitungen nicht unterstützt, soweit ich weiß. Dies ermöglicht es auch für mich eine der Ausgabe zu sammeln, die ich durch das Programm diagnostizieren müssen. Nochmals vielen Dank y'all.
Andere Tipps
Dies ist ein guter Kandidat für awk
, perl
und dergleichen Stateful Parsen (diese werden in Windows die CMD.EXE
laufen, vorausgesetzt, Sie haben perl
und / oder awk/sed
in Ihrem PATH
, sowie von natürlich auf Linux und anderen Unix-Varianten):
awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file >output_file
oder
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
Sie können einen zweiten Durchlauf durchführen Leerzeichen zu normalisieren (und trimmen Leerzeichen am Ende der Linien), wenn nötig.
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
oder
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
Sie könnten installieren Perl oder Python oder Ruby oder PHP und das Skript schreiben ziemlich leicht.