UTF-8 로케일에서 UTF-16LE 파일에 대해 정규식 검색을 수행하는 방법은 무엇입니까?

UTF-8 로케일에서 UTF-16LE 파일에 대해 정규식 검색을 수행하는 방법은 무엇입니까?

편집 : 댓글로 인해워렌 영그렇게 함으로써 내가 매우 관련된 점에 대해 명확하지 않다는 것을 깨달았습니다. 내 검색 문자열은 이미 UTF-16LE 순서입니다(UTF-16BE인 유니코드 코드 포인트 순서가 아님). 따라서 유니코드 문제는 다소 논란의 여지가 있습니다.

어쩌면 내 문제는 (문자 대신) 그룹의 바이트를 grep하는 방법일 것입니다.2바이트, 즉. 그러면 UTF-16LE는 \x09\x0ATAB, 개행 문자로 처리되지 않고 정확히 UTF-16LE인 2바이트로 처리됩니까 ? ...참고: UTF-16 서로게이트 쌍에 신경 쓸 필요가 없으므로 2바이트 청크도 괜찮습니다.

다음은 이 3자 문자열에 대한 예제 패턴입니다 ऊपर.

  • \x09\x0A\x09\x2A\x09\x30

    그러나 문자열이 파일에 있더라도 아무것도 반환하지 않습니다.

(원문글은 여기입니다)
형식 모드를 사용하여 UTF-16LE 파일을 검색할 때 \x00\x01\x...etc일부 값에 문제가 있습니다 . sed을(를 ) 사용해 왔지만 grepUTF-8 로케일에서는 특정 UTF-16LE 값을 ASCII 문자로 인식합니다. UTF-16 사용이 제한되어 있어 UTF-8로 다시 인코딩할 수 없습니다.

예를 들어. 이 텍스트 (UNICODE 090A)에서는 단일 문자이지만 두 개의 ASCII 문자 의 합 으로 처리됩니다 . \x09\x0A

grep-P패턴을 검색하는 (perl) 옵션이 있지만 \x00\x...동일한 ASCII 해석을 얻습니다.

UTF-16 모드에서 검색 할 수 있는 방법이 있습니까 grep -P? 아니면 Perl이나 다른 스크립트를 통해 검색하는 방법이 더 좋을 수도 있습니다.

grep컴팩트하기 때문에 가장 매력적인 것 같지만, 어떤 작업을 하든 이 선호도가 뒤집힌다.

참고로 내 예제에서는 리터럴 문자열을 사용하지만 실제 사용에는 정규식 스타일 검색이 필요합니다. 그래서이 Perl 예제정확히 내가 원하는 것은 아니지만 파일을 UTF-16으로 처리하지만... 파일을 열고 닫을 필요가 없는 것이 낫습니다... perl정규식 검색과 같은 기본 작업을 위한 더 간단한 방법이 있다고 생각합니다. 저는 이 간결한 구문을 가진 것을 찾고 있습니다.

답변1

내 대답은 기본적으로 다음과 같습니다.이 주제에 대한 다른 질문:

$ iconv -f UTF-16LE -t UTF-8 myfile.txt | grep pattern

다른 질문과 마찬가지로 줄 끝 변환이 필요할 수도 있지만 요점은 기본 도구를 직접 사용할 수 있도록 파일을 기본 인코딩으로 변환해야 한다는 것입니다.

답변2

설치하다ripgrep유용UTF-16을 지원합니다.

예를 들어:

rg pattern filename

ripgrep은 UTF-16, latin-1, GBK, EUC-JP, Shift_JIS 등과 같은 UTF-8 이외의 텍스트 인코딩으로 파일 검색을 지원합니다. (UTF-16 자동 감지에 대한 일부 지원이 제공됩니다. 다른 텍스트 인코딩은 / 로 -E지정 해야 합니다 --encoding flag.)

모든 줄을 인쇄하려면 다음을 실행하세요 rg -N . filename.

답변3

나는 워렌의 대답이 더 낫다고 믿는다일반적인*nix 솔루션이지만 이 Perl 스크립트는 내가 원하는 방식으로 정확하게 작동합니다(다소 비표준적인 상황에서). 검색 패턴의 현재 형식을
약간 변경해야 합니다 \x09\x0A\x09\x2A\x09\x30\x00\s09
     .\x{090A}\x{092A}\x{0930}\x{0009}

그것은 하나의 프로세스로 모든 것을 수행하는데, 이것이 제가 추구하는 것입니다.

#! /usr/bin/env perl
use strict;
use warnings;
die "3 args are required" if scalar @ARGV != 3;
my $if =$ARGV[0];
my $of =$ARGV[1];
my $pat=$ARGV[2];
open(my $ifh, '<:encoding(UTF-16LE)', $if) or warn "Can't open $if: $!";
open(my $ofh, '>:encoding(UTF-16LE)', $of) or warn "Can't open $of: $!";
while (<$ifh>) { print $ofh $_ if /^$pat/; }

답변4

우그레프(Universal grep)은 유니코드, UTF-8/16/32 파일을 지원하고 잘못된 유니코드를 감지하여 올바른 결과를 보장하고 텍스트 및 바이너리 파일을 표시하며 빠르고 무료입니다.

우그레프UTF-8/16/32 입력 및 기타 형식을 검색합니다. 옵션 -Q를 사용하면 ISO-8859-1~16, EBCDIC, 코드 페이지 437, 850, 858, 1250~1258, MacRoman 및 KOI8과 같은 다양한 파일 형식을 검색할 수 있습니다.

일치하는 유니코드 문자 패턴을 지정하십시오.

ugrep -QUTF-16LE "ऊपर" filename

또는 16진수 코드 포인트를 사용하세요.

ugrep -QUTF-16LE "\x{090A}\x{092A}\x{0930}" filename

바라보다GitHub의 ugrep더 알아보기.

관련 정보