Text-Processing

如何在 UTF-8 語言環境中在 UTF-16LE 文件中進行正則表達式搜尋?

  • January 13, 2020

編輯:由於Warren Young的評論,這讓我意識到我在一個非常相關的點上並不清楚。我的搜尋字元串已經是 UTF-16LE 順序(不是 Unicode 程式碼點順序,即 UTF-16BE),所以也許 Unicode 問題有點沒有實際意義,

也許我的問題是如何在2-bytes組中查找字節(而不是字元) ,即。這樣 UTF-16LE\x09\x0A就不會被視為 TAB、換行符,而是恰好是 UTF-16LE 的 2 個字節?… 注意:我不需要關心 UTF-16 代理對,所以 2 字節塊就可以了。

這是此 3 字元字元串的範例模式ऊपर

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

但它什麼也不返回,儘管字元串在文件中。

(here is the original post)

在搜尋帶有\x00\x01\x...etc格式模式的UTF-16LE文件時,我遇到了一些值的問題。我一直在使用sed(並嘗試過grep),但是在 UTF-8 語言環境中,他們將一些 UTF-16LE 值辨識為 ASCII 字元。我被鎖定在使用 UTF-16,因此重新編碼為 UTF-8 不是一種選擇。

例如。在此文本(UNICODE 090A) 中,雖然它是單個字元,但被視為兩個 ASCII 字元\x09\x0A.

grep有一個-P(perl)選項可以搜尋\x00\x...模式,但我得到了相同的 ASCII 解釋。

有沒有辦法grep -P在 UTF-16 模式下搜尋,或者更好,如何做到這一點是 perl 或其他腳本。

grep由於它的緊湊性,它似乎是最吸引人的,但無論完成什麼工作都會超越這種偏好。

附言; 我的範例使用文字字元串,但我的實際使用需要正則表達式樣式搜尋。所以這個 perl 範例並不是我所追求的,儘管它確實將文件處理為 UTF-16……我寧願不必打開和關閉文件……我認為perl有更緊湊的基本方法諸如正則表達式搜尋之類的東西。我正在追求具有這種緊湊語法的東西。

我的回答與您關於此主題的其他問題基本相同:

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

與另一個問題一樣,您可能也需要行結束轉換,但關鍵是您應該將文件轉換為本地編碼,以便您可以直接使用本機工具。

我相信 Warren 的回答是一個更好的*通用**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/; }

引用自:https://unix.stackexchange.com/questions/40375