Comment countr le nombre de lignes dans un file UTF-16LE / CR-LF / BOM?

La pensée immédiate est wc , mais alors la prochaine pensée pas si immédiate est … Est-ce que wc * nix est purement pour les terminaisons de ligne * nix \ x0a? … Il semble donc.

Je l'ai malmené, mais je pense qu'il peut / doit y avoir un moyen plus simple que de travailler sur un vidage hexadécimal de l'original.

Voici ma version, mais il y a encore une divergence mystérieuse dans les résultats. wc signale 1 plus 0a que la sum de CRLF + 0a de ce script.

  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) 

Sortie

 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 

Existe-t-il un moyen plus standard / simple de le faire?

Voici un script perl qui ouvre des files (donnés comme arguments de command line) dans UTF-16 (endianness détecté via BOM), et count les lignes.

 #! /usr/bin/env perl use ssortingct; 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; } 

(Dies si la nomenclature n'est pas comprise.)

Je voudrais convertir le file en UTF-8 avec des fins de ligne LF, afin que je puisse utiliser directement les outils natifs:

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

La partie dos2unix est le bit le plus dos2unix . Il existe de nombreuses variantes de cet outil, qui ne sont pas toutes connues pour être utilisées dans un pipeline. Parfois, il est appelé quelque chose d'autre, comme d2u .

Si vous avez la version de dos2unix> = 7.1, vous pouvez utiliser l'option -i pour get des informations sur le nombre de sauts de ligne. Les files UTF-16 sont également supportés. Lorsque le file a une nomenclature dos2unix détecte automatiquement qu'il est UTF-16, LE ou BE. Lorsque le file n'a pas de nomenclature, vous pouvez utiliser l'option -ul pour indiquer qu'elle est UTF-16LE (ou -ub pour UTF-16BE).

dos2unix -i imprimera le nombre de sauts de ligne DOS, Unix et Mac dans cet ordre. Exemple (avec nomenclature):

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

Sans nomenclature:

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

Consultez le manuel pour plus d'informations.