Perl
有人可以解釋一下這個 perl 腳本嗎?
下面是我同事給的perl命令?
{perl -lne 's/^/\\n/ if $.>1 && /^(\d+)~(\d+)~(\d+)~(\d+)~(\d+)/; printf "%s",$_' filename;}
他說它用於刪除空白行並檢查前五個欄位中的數字。
提前致謝。
那麼欄位是用波浪號分隔的嗎?有趣的是行之間的分隔符。這將是一個
\n
但不是換行符。所以作為解釋:
該
s/^/\\n/
命令替換以開頭的行,\n
但前提是後面的條件if
都為真:
- 行號必須大於 1 (
$.>1
)- 該行需要包含至少 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$
它將跳過所有不以這五個欄位開頭的行,因此跳過空行。