
我有以下字串
echo -e "a12\x8fb12\x9f" | xxd
0000000: 6131 328f 6231 329f 0a a12.b12..
並想要刪除序列12\x9f
和12\x8f
。sed
我可以用這個命令做到這一點
sed -e 's_12\x8f__g' -e 's_12\x9f__g'
但為什麼這個命令不起作用呢?
sed -e 's_12[\x8f\x9f]__g'
答案1
那是因為[...]
角色匹配。sed
將嘗試根據 中指定的範圍來匹配字元[...]
。在 UTF-8 語言環境中,您只能遇到\x8f
作為多位元組字元的一部分。您會注意到它.
也不匹配(這是 POSIX 要求)。
例如:
sed 's/[eé\xa9]//'
沒有意義。é
是一個字元(編碼為0xc3 0xa9
),0xa9 不是一個字元而是一個字節,可以在字元內部找到(如é
),e
是一個字元(編碼為 0x65)。您不能指望sed
能夠以某種方式匹配字元內的 0xa9 和位元組。
將任意位元組資料與文字像這樣的實用程序sed
,您將需要使用字元為位元組的語言環境,這是典型的情況LC_ALL=C
。
LC_ALL=C sed 's/12[\x8f\x9f]//g'
或便攜式:
LC_ALL=C sed "$(printf 's/12[\217\237]//g')"
請注意,您不能期望使用sed
.perl -p/-n
在這種情況下請使用。