回答:
grepは、POSIXで定義されている正規表現を使用しています。何らかの理由で、POSIXは\t
タブとして定義されていません。
いくつかの選択肢があります:
grepに、perlで定義された正規表現を使用するように指示します(perlは\t
タブとして):
grep -P "\t" foo.txt
manページは、これが「実験的」機能であることを警告しています。少なくとも\t
うまくいくようです。しかし、より高度なperl正規表現機能はそうではないかもしれません。
printfを使用して、タブ文字を印刷します。
grep "$(printf '\t')" foo.txt
リテラルタブ文字を使用します。
grep "^V<tab>" foo.txt
つまりgrep "
、を入力してからを押しctrl+v
、次にを押してtab
からを入力し" foo.txt
ます。ctrl+v
ターミナルで押すと、次のキーがそのまま使用されます。つまり、端末はタブキーにバインドされた何らかの機能をトリガーする代わりにタブ文字を挿入します。
bashのANSI Cクォート機能を使用します。
grep $'\t' foo.txt
これはすべてのシェルで機能するわけではありません。
awkを使用します。
awk '/\t/'
sedを使用します。
sed -n '/\t/p'
POSIXおよびその他のシステムで定義されている文字クラスの概要については、正規表現に関するウィキペディアの記事を参照してください。
grep $'\t' foo.txt
(私は通常、書きますfgrep
の代わりにgrep
)
grep "$(printf '\t')${myvar}" foo.txt
。うまくいきました。数回試してみたところ、最後のフォームが機能しませんでした。
grep
が黙っ\t
てタブとして解釈できない理由はありますか?POSIXはそれが\t
何か他のものを意味することを要求しますか?おそらく、リテラルの\
後にt
?が続くだけに一致するはずです。
This is highly experimental and grep -P may warn of unimplemented features.
おそらく-P
レガシーシステムで使用するのは良い考えではありません。printf
選択が優れている
それはあなたが聞きたいと思う答えそのものではありませんが、エスケープシーケンスの可能な使用はbashによって提供されます
command | grep $'\t'
(二重引用符で囲まないでください!)。
grep $'\t'
。
awk '/\t/'
私のお気に入りの回避策です:
printf 'a\t\nb' | awk '/\t/'
出力:a\t
。
タブにはASCIIの16進コードを使用することに常に頼ることができます。
$ echo "one"$'\t'"two" > input.txt
$ grep -P "\x9" input.txt
one two
$ grep $'\x9' input.txt
one two