誰かが私にこのPerlスクリプトを説明できますか?

誰かが私にこのPerlスクリプトを説明できますか?

これは私の同僚が提供したPerlコマンドです。

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

彼は空の行を削除し、最初の5つのフィールドの数字を確認するために使用されると述べました。

よろしくお願いします。

答え1

それでは、フィールドはチルダで区切られていますか?興味深い点は、行間の区切り記号です。これは\n改行文字ですが、改行文字ではありません。

説明は次のとおりです。

このs/^/\\n/コマンドは、次から始まる行を置き換えます。\nif

  1. $.>1行番号は1()より大きくなければなりません。
  2. 行には、チルダで区切られた5つ以上の数字を含める必要があります。

その後、すべての行(空白行を除く(パラメータで防止-l))が印刷されます(printf "%s", $_)。コードは最初の5つのフィールドに数字が含まれることを保証しません!

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$

コマンドの周りの中かっこに関して他の場所から呼び出すことができます。数字を含む5つのフィールドの存在を保証する別の(おそらくより短い)バージョンは次のとおりです。

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$

この5つのフィールドで始まらない行はすべてスキップされるため、空白行はスキップされます。

関連情報