
次の文字列があります
echo -e "a12\x8fb12\x9f" | xxd
0000000: 6131 328f 6231 329f 0a a12.b12..
12\x9f
シーケンスsumを削除したいです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