Espressione regolare MultiLine e output in un file in Windows
Domanda
Ho un file di registro da cui devo estrarre modelli specifici.Devo trovarli e quindi elaborarli in un nuovo file.grep su Linux di solito farebbe il trucco, ma l'espressione regolare si estende su più righe, cosa che capisco che grep non faccia.
ecco un esempio dal mio file di registro/debug:
Da:
1.328 0.5045
Db:
0.6415 0.1192
Lambda:
0.4429 -0.35
-0.0461 -0.02421
seps:
0.714272
Sto cercando /Lambda:\n([-\d\.]+)\s+([\-\d\.]+)\s+\n([\-\d\.]+)\s+([\-\d\.]+)/
Voglio quindi inviare le righe in un nuovo file rimuovendo lambda e riorganizzare i numeri sulla stessa riga in modo da ottenere l'output \1\s\2\s\3\s\4\n
Quindi in realtà ho due domande:
- Esiste un'utilità semplice per eseguire questa operazione, su qualsiasi sistema?
- C'è un modo per farlo specificatamente su Windows?
Spero che ci sia una soluzione semplice a questo che mi è sfuggito.Preferirei restare su Windows, ma se dovessi passare a Linux lo farò.
Soluzione 3
grazie per tutte le risposteMi piacciono le risposte che mi hai dato per Perl e Awk.Sono uno di quegli strani programmatori che non conoscono Perl, quindi ho preso la strada di Ruby.ecco la mia soluzione
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
}
questo posso usarlo come utility con il mio editor Notepad++ tramite NppExec, che non supporta reindirizzamento e piping, per quanto ne so.Ciò mi consente anche di raccogliere qualsiasi output di cui ho bisogno per diagnosticare in base al programma.Grazie ancora a tutti.
Altri suggerimenti
Questo è un buon candidato per awk
, perl
e simili analisi con stato (funzioneranno su entrambi i sistemi Windows CMD.EXE
, a condizione che tu lo abbia perl
e/o awk/sed
nel tuo PATH
, oltre che, ovviamente, su Linux e altri Unice):
awk "/^Lambda/ { in_lambda=1 ; next } in_lambda && /^ *$/ { in_lambda=0 ; printf \"\n\" ; next } in_lambda { printf \"%s \", $0 }" input_file >output_file
O
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
Se necessario, puoi eseguire un secondo passaggio per normalizzare gli spazi bianchi (e tagliare gli spazi bianchi alla fine delle righe).
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
O
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
Potresti installare Perl o Python o Ruby o PHP e scrivere lo script abbastanza facilmente.