いくつかのUTF-8文字を一致させようとしています。問題は、バイトエスケープがgrep
変換されずに\x
失敗することです。
echo -e '\xd8\xaa' | grep -P '\xd8\xaa'
これが成功した場合:
echo -e '\xd8\xaa' | grep -P $(printf '\xd8\xaa')
printfを使わずにgrepがバイトエスケープを直接理解できますか?どのように?
答え1
失敗します。
$ 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'形式の単語は特別に扱われます。ワードは、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
拡張結果は、ドル記号がないかのように単一引用符で囲まれます。