Perl

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

  • May 31, 2017

下面是我同事給的perl命令?

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

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

提前致謝。

那麼欄位是用波浪號分隔的嗎?有趣的是行之間的分隔符。這將是一個\n但不是換行符。

所以作為解釋:

s/^/\\n/命令替換以開頭的行,\n但前提是後面的條件if都為真:

  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$

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

引用自:https://unix.stackexchange.com/questions/368279