Perl을 통해 특정 줄의 개행을 제거하는 방법은 무엇입니까?

Perl을 통해 특정 줄의 개행을 제거하는 방법은 무엇입니까?

Perl 단일 행 명령을 통해 특정 행의 개행 문자를 제거하고 싶습니다.

입력하다:

1407233497,1407233514,bar
1407233498,1407233515,foo
mingstats&fmt=n
1407233499,1407233516,foobar

예상 출력:

1407233497,1407233514,bar
1407233498,1407233515,foomingstats&fmt=n
1407233499,1407233516,foobar

나는 지금까지 무엇을 시도했는가?

이 정규식은 \n(?!\d+,\d+)제거하려는 개행 문자와 정확히 일치합니다. 하지만 Perl 한 줄 명령을 통해 이를 달성하는 방법을 모르겠습니다. 나는 노력했다.

perl -pe 's/\n(?!\d+,\d+)//g' file

그러나 파일의 모든 줄 바꿈을 제거하고 다음 줄을 한 줄로 인쇄하게 됩니다.

1407233497,1407233514,bar1407233498,1407233515,foomingstats&fmt=n1407233499,1407233516,foobar

Perl 한 줄 명령이 위의 정규식을 사용했다면 기쁠 것입니다...

답변1

노력하다:

$ perl -00pe 's/\n(?!\d+,\d+)//g' file
1407233497,1407233514,bar
1407233498,1407233515,foomingstats&fmt=n
1407233499,1407233516,foobar

perl기본적으로 옵션을 사용하여 파일을 한 줄씩 읽으므로 -p정규 표현식이 작동하지 않습니다.

-00옵션은 단락 소리 흡수 모드를 활성화하고 이제 정규 표현식이 여러 줄에서 작동합니다.

perldoc perlrun에서:

-0[8진수/16진수]

입력 레코드 구분 기호($/ )를 8진수 또는 16진수로 지정합니다. 숫자가 없으면 널 문자가 구분 기호입니다. 다른 스위치는 번호 앞이나 뒤에 위치할 수 있습니다. 예를 들어, null로 끝나는 파일 이름을 인쇄하는 find 버전이 있는 경우입니다.

...

특수 값 00은 Perl이 단락 모드에서 파일을 읽도록 합니다. 0400 이상의 값은 Perl이 전체 ​​파일을 읽게 하지만 일반적으로 이 목적으로 0777 값이 사용됩니다.

답변2

perl -pe 'print "\n" if $c and !/^(?!\d+,\d+)/; $c=chomp; END{print "\n" if $c}' file_name

관련 정보