有人可以為我解釋一下這個 perl 腳本嗎?

有人可以為我解釋一下這個 perl 腳本嗎?

以下是我同事給的perl指令?

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

他說它用於刪除空白行並檢查前五個字段中的數字。

提前致謝。

答案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$

它將跳過所有不以這五個欄位開頭的行,因此跳過空白行。

相關內容