誰かこの 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 つのフィールドで始まっていない行はすべてスキップされ、したがって空行もスキップされます。

関連情報