UTF-8ロケールでUTF-16LEファイルを正規表現検索する方法は?

UTF-8ロケールでUTF-16LEファイルを正規表現検索する方法は?

編集:コメントのためウォーレンヤングそうすることで、私は非常に関連した点については明確ではないことに気づきました。私の検索文字列はすでにUTF-16LEの順序です(UTF-16BEのUnicodeコードポイントの順序ではありません)。したがって、Unicodeの問題は多少議論の余地があります。

たぶん私の問題は(文字の代わりに)グループのバイトを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)では単一文字ですが、2つの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}

それは1つのプロセスですべてを行いますが、これが私が求めているものです。

#! /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)はUnicode、UTF-8/16/32ファイルをサポートし、誤ったUnicodeを検出して正しい結果を保証し、テキストとバイナリファイルを表示し、高速で無料です.

ウグレフUTF-8/16/32 入力やその他の形式を検索します。オプション-Qを使用すると、ISO-8859-1〜16、EBCDIC、コードページ437、850、858、1250〜1258、MacRoman、KOI8などのさまざまなファイル形式を検索できます。

一致するUnicode文字パターンを指定してください。

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

または16進コードポイントを使用してください。

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

バラよりGitHubのugrepもっと学ぶ。

関連情報