
我有一個文字文件,其中包含大量記錄,每筆記錄都佔一行。一些記錄具有已損壞的特殊字符,我試圖通過查找高於的多個字符序列來找到這些字符x80
這是一個單行範例,其中突出顯示了不正確的字元:
感興趣的十六進位字串是:
49 CC 80 C2 B9 6E
當我使用 GNU Grep 時,grep --color='auto' -P -n "[\x80-\xFF]" record.txt
它僅匹配該行的一部分,它匹配上標 1 ( ¹
) 但不匹配Ì
:
Grep 似乎無法將組合的字元+變音符號分開...
我想做的是只保留具有兩個或多個連續x80
字元的行 - 並且能夠匹配十六進位代碼中顯示的實際字元 - 即49 CC 80 C2 B9 6E
看起來它應該匹配類似的東西"[\x80-\xFF]{2,10}"
- 但這種匹配確實不行。
因此,為了澄清,當我使用它時,該行匹配:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt
但是當我使用它時,它不會:
grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
第二個不應該也匹配嗎,因為位元組序列是CC 80 C2 B9
由 4 個連續位元組組成的字串,其值為x80-xFF
?
答案1
這可能與區域設定相關。如果是這樣,使用 C(又稱 POSIX)語言環境(其中字元是位元組)可能會起作用:
LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]{2,10}" record.txt
答案2
Grep 可能會對奇怪的字符感到奇怪...嘗試:
grep --color='auto' -P -n "[\x80-\xFF]" record.txt | iconv -f utf-16 -t utf-16
它可能會找回你的字母......但你的顏色會丟失。可能值得對 utf-16 和 utf-8 進行修改。
並確保您的控制台能夠處理 uft-8,並且未指派給某些 ansi 設定。