누군가 나에게 이 Perl 스크립트를 설명해 줄 수 있나요?

누군가 나에게 이 Perl 스크립트를 설명해 줄 수 있나요?

다음은 내 동료가 제공한 Perl 명령입니다.

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

그는 빈 행을 제거하고 처음 5개 필드의 숫자를 확인하는 데 사용된다고 말했습니다.

미리 감사드립니다.

답변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$

이 5개 필드로 시작하지 않는 모든 줄을 건너뛰므로 빈 줄은 건너뜁니다.

관련 정보