MultiLine expressão regular e saída para um arquivo no Windows
Pergunta
Eu tenho um arquivo de log que eu preciso para extrair padrões específicos de. Eu preciso encontrar e, em seguida, processá-los em um novo arquivo. grep em Linux normalmente seria fazer o truque, mas os vãos de expressão regular várias linhas, que eu entendo grep não fazer.
aqui está um exemplo do meu arquivo de log / debug:
Da:
1.328 0.5045
Db:
0.6415 0.1192
Lambda:
0.4429 -0.35
-0.0461 -0.02421
seps:
0.714272
Eu estou procurando /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/
Eu, então, quer para a saída as linhas para um novo arquivo removendo o lambda e reorganizar os números na mesma linha para \1\s\2\s\3\s\4\n
saída
Então, eu tenho na verdade, duas perguntas:
- Existe um utilitário fácil de fazer isso, em qualquer sistema?
- Existe uma maneira de fazer isso especificamente no windows?
Eu estou esperando há uma solução simples para isso que me escapou. Eu prefiro ficar em janelas, mas se eu tiver que ir para Linux eu vou para obter este feito.
Solução 3
obrigado por todas as respostas. I como as respostas que me deram para o perl e awk. Eu sou um desses programadores estranhas que não conhece perl, por isso, tomei a rota rubi. aqui está a minha solução
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
}
isso eu posso usar como um utilitário com o meu editor Notepad ++ através NppExec, que não faz redirecionamento suporte e tubulação, tanto quanto eu sei. Isso também permite que para mim para recolher quaisquer da saída que eu preciso para diagnosticar por programa. Obrigado mais uma vez vocês.
Outras dicas
Este é um bom candidato para awk
, perl
e similares stateful parsing (estes serão executados em CMD.EXE
tanto do Windows, desde que tenha perl
e / ou awk/sed
em sua PATH
, bem como, de naturalmente, em Linux e outros Unices):
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
Você pode realizar uma segunda passagem para o espaço em branco normalize (e espaço em branco guarnição no final das linhas), se necessário.
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
Você pode instalar Perl ou Python ou Ruby ou PHP e escrever o roteiro com bastante facilidade.