MultiLine Expression régulière et la sortie vers un fichier dans Windows
Question
J'ai un fichier journal que j'ai besoin d'extraire des modèles spécifiques de. Je dois trouver, puis de les traiter dans un nouveau fichier. grep sur Linux serait généralement faire l'affaire, mais l'expression régulière s'étend sur plusieurs lignes, que je comprends grep ne le fait pas.
ici est un exemple de mon journal / fichier de débogage:
Da:
1.328 0.5045
Db:
0.6415 0.1192
Lambda:
0.4429 -0.35
-0.0461 -0.02421
seps:
0.714272
Je cherche /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/
Je veux alors sortir les lignes dans un nouveau fichier de retirer le lambda et réarranger les numéros sur la même ligne pour la sortie \1\s\2\s\3\s\4\n
J'ai en fait deux questions:
- Y at-il un utilitaire facile d'y arriver, sur tout système?
- Est-il possible de le faire spécifiquement sur les fenêtres?
J'espère qu'il ya une solution simple à ce qui m'a échappé. Je préfère rester dans les fenêtres, mais si je dois aller à Linux, nous pour y parvenir.
La solution 3
Merci pour toutes les réponses. J'aime les réponses que vous avez données pour me perl et awk. Je suis l'un de ces programmeurs étranges qui ne connaissent pas perl, donc je pris la route rubis. voici ma 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
}
ce que je peux utiliser comme un utilitaire avec mon éditeur Notepad ++ par NppExec, qui ne supporte pas et redirect la tuyauterie, pour autant que je sache. Cela permet aussi de me collectionne tout de la sortie que je dois diagnostiquer par le programme. Merci encore vous tous.
Autres conseils
Ceci est un bon candidat pour awk
, perl
et comme stateful d'analyse syntaxique (ceux-ci se déroulera dans les deux CMD.EXE
de Windows à condition que vous avez perl
et / ou awk/sed
dans votre PATH
, ainsi que, de Bien sûr, sur Linux et autres Unix):
awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file >output_file
ou
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
Vous pouvez effectuer un second passage pour normaliser les espaces (et suppression des espaces à la fin des lignes) en cas de besoin.
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
ou
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
Vous pouvez installer Perl ou Python ou Ruby ou PHP et écrire assez facilement le script.