Könnte mir jemand dieses Perl-Skript erklären?

Könnte mir jemand dieses Perl-Skript erklären?

Folgendes ist der Perl-Befehl meines Kollegen?

{perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename;} 

Er sagte, dies diene dazu, Leerzeilen zu entfernen und die ersten fünf Felder auf eine Zahl zu prüfen.

Dank im Voraus.

Antwort1

Die Felder werden also durch ein Tilde-Zeichen getrennt? Interessant ist das Trennzeichen zwischen den Zeilen. Es wird ein sein, \naber kein Zeilenumbruch.

Also zur Erklärung:

Der s/^/\\n/Befehl ersetzt die Zeile mit „start with“, \njedoch nur, wenn die folgenden Bedingungen ifbeide erfüllt sind:

  1. Die Zeilennummer muss größer als 1 sein ( $.>1)
  2. Die Zeile muss mindestens 5 durch Tilde-Zeichen getrennte Zahlen enthalten.

-lAnschließend werden alle Zeilen (außer leere Zeilen (werden per Parameter vermieden ) ausgedruckt ( printf "%s", $_). Der Code garantiert nicht, dass die ersten 5 Felder eine Zahl enthalten!

user@pc:/tmp$ cat inputfile.txt 
1~2~3~4~5

6~7~8~9~0

1~2~3~4~5
1~2~3~4

b~2~3
user@pc:/tmp$ perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename
1~2~3~4~5\n6~7~8~9~0\n1~2~3~4~51~2~3~4b~2~3user@pc:/tmp$

Ich bin mir nicht sicher, was die geschweiften Klammern um den Befehl angeht. Vielleicht möchten Sie ihn von woanders aus aufrufen. Eine andere (vielleicht kürzere) Version, die die Existenz von 5 Feldern mit Zahlen garantiert, ist:

user@pc:/tmp$ perl -ne 'next unless (/^\d+~\d+~\d+~\d+~\d+/); print $_;' inputfile.txt 
1~2~3~4~5
6~7~8~9~0
1~2~3~4~5
user@pc:/tmp$

Es werden alle Zeilen übersprungen, die nicht mit diesen fünf Feldern beginnen, und daher auch leere Zeilen.

verwandte Informationen