web-dev-qa-db-ja.com

grepにバイトエスケープを理解させる

いくつかのUTF-8文字と照合しようとしています。問題は、grep\xバイトエスケープを変換しないため、これが失敗することです。

echo -e '\xd8\xaa' | grep -P '\xd8\xaa'

これが成功している間:

echo -e '\xd8\xaa' | grep -P $(printf '\xd8\xaa')

Grepは、printfを使用せずにバイトエスケープを直接理解できますか?どうやって?

4
RYN

これは失敗します:

$ 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

展開された結果は、ドル記号が存在しないかのように、単一引用符で囲まれています。

4
John1024