有人能给我解释一下这个 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$

它将跳过所有不以这五个字段开头的行,因此跳过空行。

相关内容