UTF-16LE/CR-LF/BOM 파일의 줄 수를 어떻게 계산합니까?

UTF-16LE/CR-LF/BOM 파일의 줄 수를 어떻게 계산합니까?

가장 즉각적인 아이디어는 이지만 wc, 다음으로 덜 직접적인 아이디어는... *nix wc는 순전히 *nix 라인 엔딩 \x0a?만을 위한 것입니다. ...그런 것 같군요.

이 문제를 해결했지만 원본 파일의 16진수 덤프를 처리하는 것보다 더 쉬운 방법이 있을 수도 있고 있어야 한다고 생각합니다.

이것은 내 버전이지만 개수에는 여전히 신비한 차이가 있습니다. wc이 스크립트에 대한 +의 합보다 더 많은 1을 보고합니다 0a. CRLF0a

 file="nagaricb.nag"
 echo Report on CR and LF in UTF-16LE/CR-LF
 echo =====================================
 cat "$file" | # a useles comment, courtesy of cat 
   xxd -p -c 2 |
     sed -nr '
       /0a../{
           /0a00/!{
               i ‾‾`0a:   embedded in non-newline chars       
               b
           }
       }
       /0d../{
           /0d00/!{
               i ‾‾`0d:   embedded in non-newline chars       
               b
           }
       }
       /0a00/{
           i ‾‾`CR: found stray 0a00       
           b
        }
       /0d00/{
           N
           /0d00\n0a00/{
               i ‾‾`CRLF: found as normal newline pairs
               b
           }
           i ‾‾`LF: found stray 0d00
        }' |
         sort |
           uniq -c
 echo "  ====="
 printf '  %s ‾‾`wc\n' $(<"$file" wc -l)

산출

Report on CR and LF in UTF-16LE/CR-LF
=====================================
    125 ‾‾`0a:   embedded in non-newline chars       
    407 ‾‾`0d:   embedded in non-newline chars       
  31826 ‾‾`CRLF: found as normal newline pairs
  =====
  31952 ‾‾`wc

이를 수행하는 좀 더 표준적이고 간단한 방법이 있습니까?

답변1

기본 도구를 직접 사용할 수 있도록 파일을 LF 줄 끝이 있는 UTF-8로 변환하겠습니다.

$ iconv -f UTF-16LE -t UTF-8 myfile.txt | dos2unix | wc -l

dos2unix부분이 가장 까다로운 부분이다. 이 도구에는 다양한 변형이 있지만 모두가 파이프라인에서 사용하는 방법을 아는 것은 아닙니다. 때로는 등의 다른 이름으로도 불립니다 d2u.

답변2

다음은 UTF-16(BOM을 통해 감지된 바이트 순서)에서 파일(명령줄 인수로 제공됨)을 열고 줄 수를 계산하는 Perl 스크립트입니다.

#! /usr/bin/env perl
use strict;
use warnings;

while (my $file = shift @ARGV) {
    my $fh;
    if (!open($fh, '<:encoding(UTF-16)', $file)) {
        print STDERR "Failed to open [$file]: $!\n";
        next;
    }
    my $count = 0;
    $count++ while (<$fh>);
    print "$file: $count\n";
    close $fh;
}

(BOM을 이해하지 못하면 죽습니다.)

답변3

dos2unix 버전이 7.1보다 큰 경우 -i 옵션을 사용하여 개행 수에 대한 정보를 얻을 수 있습니다. UTF-16 파일도 지원됩니다. 파일에 BOM이 있으면 dos2unix는 UTF-16, LE 또는 BE인지 자동으로 감지합니다. 파일에 BOM이 없으면 -ul 옵션을 사용하여 파일이 UTF-16LE(또는 UTF-16BE의 경우 -ub)임을 알릴 수 있습니다.

dos2unix -i는 DOS, Unix 및 Mac 개행 문자 수를 순서대로 인쇄합니다. 예(BOM 포함):

$ dos2unix -i utf16le.txt
      50       0       0  UTF-16LE  text    utf16le.txt

BOM 없음:

$ dos2unix -ul -i utf16len.txt
      50       0       0  no_bom    text    utf16len.txt

자세한 내용은 설명서를 참조하세요.

관련 정보