grepコマンドをターミナルで実行した場合、タブの検索ができません。
以下の方法でタブを検索することができます。
2012/6/22 追記
bashで動作確認をしました。
man bashをみると以下の記述がありました。
クォート クォート (quoting) を使うと、特定の文字や単語のシェルに対する特別な意味を取り除けます。クォー ト を用いると、特殊文字の特殊な扱いを無効にすることや、予約語が予約語として識別されることを防 いだり、パラメータの展開を防げます。 <snip> $’string’ の形式を持つ単語は特殊な扱いを受けます。この単語は string に展開され、それから ANSI C 標準で仕様が決められている、バックスラッシュでエスケープされている文字に置き換えられます 。 バックスラッシュエスケープシーケンスは、 (もし存在すれば) 以下のようにデコードされます: \a 警告 (ベル) \b バックスペース \e エスケープ文字 \f フォームフィード文字 \n 改行文字 \r 復帰文字 \t 水平タブ文字 <snip>
実際、$'\t'がtabになるかを確認してみます。
16進数で09なのでHT(水平タブ)になります。
[sakura@centos ~]$ echo -n $'\t' | hexdump -C 00000000 09 |.| 00000001 [sakura@centos ~]$ echo -n $'\t\t' | hexdump -C 00000000 09 09 |..| 00000002
実際に以下のようなファイルでgrepしてみました。
# one tab between the words. centos 5.7 centos 5.8 centos 6.1 centos 6.2 ubuntu 10.04 ubuntu 12.04 # two tab between the words. fedora 16 fedora 17 debian lenny debian squeeze # first character is tab. linux windows freebsd
$ grep ^$'\t' tab_test_file.txt linux windows freebsd
$ grep $'\t\t' tab_test_file.txt fedora 16 fedora 17 debian lenny debian squeeze
$ grep $'\t' tab_test_file.txt centos 5.7 centos 5.8 centos 6.1 centos 6.2 ubuntu 10.04 ubuntu 12.04 fedora 16 fedora 17 debian lenny debian squeeze linux windows freebsd
$ grep centos$'\t' tab_test_file.txt centos 5.7 centos 5.8 centos 6.1 centos 6.2
$ grep $'\t'1 tab_test_file.txt ubuntu 10.04 ubuntu 12.04 fedora 16 fedora 17 $ grep $'\t\t'1 tab_test_file.txt fedora 16 fedora 17
以上、動作確認したシェルはbashだけですが、$'\t'でタブを指定してgrepする方法を記述しました。
grepに\tを引数としてわたしてもタブ文字はヒットしません。
検索方法としてスペースとタブの区別はできませんが[:space:]が有効です。
下記のコマンドでタブを検索すると上記でも記した通り、スペースもヒットしてしまいますので注意してください。
grep "[[:space:]]" ファイル名
bashを利用している場合は、タブキーを押してもタブ文字は入力されませんので、Ctrl+V, TABの操作でタブ文字を入力することができます。
赤字の部分がキー操作になります。Ctrl+V、TABキーの順番で入力します。
grep "Ctrl+V, TAB" ファイル名
エディタを起動しタブを検索するgrepコマンド用シェルを作成すれば簡単に検索することができます。
下記、スクリプトのgrep " "はタブが入力されています。以下のスクリプトをコピーしてもスペースとしてコピーされますので使用する場合はタブに変更するかgrep_tab.shをダウンロードしてください。
#!/bin/sh grep " " $1
使用方法は以下の通りです。
./grep_tab.sh ファイル名