Может ли кто-нибудь объяснить мне этот скрипт Perl?

Может ли кто-нибудь объяснить мне этот скрипт Perl?

Ниже приведена команда perl, данная моим коллегой.

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

Он сказал, что это для удаления пустых строк и проверки первых пяти полей на наличие числа.

Заранее спасибо.

решение1

То есть поля разделены знаком тильды? Интересно, что разделитель между строками. Это будет \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$

Он пропустит все строки, не начинающиеся с этих пяти полей, и, следовательно, пропустит пустые строки.

Связанный контент