누군가 나에게 이 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개 필드로 시작하지 않는 모든 줄을 건너뛰므로 빈 줄을 건너뜁니다.

관련 정보