grepでタブを検索する方法

grepコマンドをターミナルで実行した場合、タブの検索ができません。
以下の方法でタブを検索することができます。


$'\t' を利用する

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してみました。

filetab_test_file.txt
# 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

以上、動作確認したシェルはbashだけですが、$'\t'でタブを指定してgrepする方法を記述しました。

[:space:]を利用する

grepに\tを引数としてわたしてもタブ文字はヒットしません。
検索方法‪としてスペースとタブの区別はできませんが[:space:]が有効です。

[:space:]の実行方法

下記のコマンドでタブを検索すると上記でも記した通り、スペースもヒットしてしまいますので注意してください。

grep "[[:space:]]" ファイル名

タブをターミナル画面に入力し検索する方法

bashを利用している場合は、タブキーを押してもタブ文字は入力されませんので、Ctrl+V, TABの操作でタブ文字を入力することができます。

赤字の部分がキー操作になります。Ctrl+V、TABキーの順番で入力します。

grep "Ctrl+V, TAB" ファイル名

タブを検索するgrep用シェルを作成する

エディタを起動しタブを検索するgrepコマンド用シェルを作成すれば簡単に検索することができます。
下記、スクリプトのgrep " "はタブが入力されています。以下のスクリプトをコピーしてもスペースとしてコピーされますので使用する場合はタブに変更するかgrep_tab.shをダウンロードしてください。

filegrep_tab.sh
#!/bin/sh
grep "	" $1

使用方法は以下の通りです。
./grep_tab.sh ファイル名

関連資料



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS