2017-06-23 4 views
0

Ich habe ein einzeiligen Perl-Skript (Perl v5.10.1), die in einer Art und Weise verhält, die ich nicht verstehen kann, oder erklären:Perl/e regexp Hinzufügen unerwartetes Zeichen

$ cat packer-build.log | 
> perl -MPOSIX -pe \ 
>  's/^(\d+)/my $x = strftime("%Y-%m-%d %H:%M", localtime($1)); print "$x "/e' | tail -5 
2017-06-21 11:11 1,,error-count,1 
2017-06-21 11:11 1,,ui,error,\n==> Some builds didn't complete successfully and had errors: 
2017-06-21 11:11 1,amazon-ebs,error,unexpected EOF 
2017-06-21 11:11 1,,ui,error,--> amazon-ebs: unexpected EOF 
2017-06-21 11:11 1,,ui,say,\n==> Builds finished but no artifacts were created. 

Unfiltered Ausgabe:

$ tail -5 packer-build.log 
1498007467,,error-count,1 
1498007467,,ui,error,\n==> Some builds didn't complete successfully and had errors: 
1498007467,amazon-ebs,error,unexpected EOF 
1498007467,,ui,error,--> amazon-ebs: unexpected EOF 
1498007467,,ui,say,\n==> Builds finished but no artifacts were created. 

Beachten Sie, dass 1 nach 2017-06-21 11:11 ist, die im ungefilterten Ausgang nicht vorhanden ist.

Was bewirkt, dass dies gedruckt wird und wie kann ich den Code so ändern, dass ich die Epochzeit in Feld 1 durch eine lesbare Ausgabe ersetzen kann?

Antwort

5

Wenn /e in einer Ersetzung verwendet wird, wird die Übereinstimmung durch den Wert ersetzt, den der Ersetzungscode auswertet. Sie haben einen Anruf an print() in Ihrem Code und print() gibt einen wahren Wert (1) zurück, wenn ein Druck erfolgreich ist. Das sehen Sie in Ihrem Ersatz.

Aber Sie brauchen das nicht print(). Ersetzen Sie den Code mit diesem:

s/^(\d+)/my $x = strftime("%Y-%m-%d %H:%M", localtime($1)); $x/e 

Oder noch einfacher:

s/^(\d+)/strftime("%Y-%m-%d %H:%M", localtime($1))/e 
+0

Es gibt einen Raum in dem Druck hinzugefügt wurde, fügen Sie diese Zeichenfolge in das Format, wenn – ysth

+0

Eigentlich gewünscht wurde, dass der Raum nur soll Machen Sie es klarer, dass die "1" nicht Teil der Zeitfolge war. –

Verwandte Themen