sed正規表現16進文字

sed正規表現16進文字

次の文字列があります

echo -e "a12\x8fb12\x9f" | xxd
0000000: 6131 328f 6231 329f 0a                   a12.b12..

12\x9fシーケンスsumを削除したいです12\x8fsed

このコマンドでできます。

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

おすすめ記事