いくつかのUTF-8文字と照合しようとしています。問題は、grep
が\x
バイトエスケープを変換しないため、これが失敗することです。
echo -e '\xd8\xaa' | grep -P '\xd8\xaa'
これが成功している間:
echo -e '\xd8\xaa' | grep -P $(printf '\xd8\xaa')
Grepは、printfを使用せずにバイトエスケープを直接理解できますか?どうやって?
これは失敗します:
$ echo -e '\xd8\xaa' | grep -P '\xd8\xaa' | hexdump
これは成功します:
$ echo -e '\xd8\xaa' | grep -P $'\xd8\xaa' | hexdump
0000000 aad8 000a
0000003
man bash
から:
$ 'string'形式の単語は特別に扱われます。 Wordは文字列に展開され、バックスラッシュでエスケープされた文字はANSI C標準で指定されたとおりに置き換えられます。バックスラッシュエスケープシーケンスが存在する場合は、次のようにデコードされます。
\a alert (bell) \b backspace \e \E an escape character \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab \\ backslash \' single quote \" double quote \? question mark \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits) \UHHHHHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits) \cx a control-x character
展開された結果は、ドル記号が存在しないかのように、単一引用符で囲まれています。