テキストファイルだけを対象に文字列を検索するbashの関数。
ソース・ファイル(拡張子がc, h, S)を対象に検索する関数を実装していたが(linux(カーネル)ソース解析:システムコール呼び出し)、ファイルの名前に依らず、テキストファイルを対象に検索する場合が結構あったので、こちらも作ってみた。
function stxt() {
find . | perl -nl -e 'print if -f && -T' | xargs -I{} grep $1 {} /dev/null
}
perlのところが少し分かり難いので説明すると、
・eオプションで実行する1行のスクリプトを指定。
(複数行指定したい場合はeオプションを繋げれば良いらしい)
・nオプションで、標準入力からの入力に対して、ループでeオプションで指定したスクリプトを実行。
(while (<>) {
と}
で括ったのと同じような感じで動く)
・lオプションで、標準入力からの読み込み内容から改行を取り除く。
(改行コードがあると、if -f && -T
のところでファイル名が認識されない)
上記により、findコマンドが出力したファイル名のリストから、テキストファイルだけをperlで抜き出すように動くようになる。
上記のperlの内容を、スクリプト(whileを使った形)で書くと、次のように書ける。
#!/usr/bin/perl
while (<>) {
print if -f ($_ =~ s/[\n\r]//gr) && -T ($_ =~ s/[\n\r]//gr);
}
($_ =~ s/[\n\r]//gr)
の部分は、非破壊置換。(rが非破壊の指定)
tfil.plの実行パスを通して、tfil.pl使うように、stxtを修正すると、次のようになる。
function stxt() {
find . | tfil.pl | xargs -I{} grep $1 {} /dev/null
}
実際には上記のような修正はしないが、perl -nl -e 'print if -f && -T'
が多少はイメージしやすくなるかと思って、ちょっと強引に実装してみました。
Cのソースを読んだりする時に、Makefileや、拡張子がc, h, S以外のファイルをincludeしている場合や、vimとかコマンドの環境を調べたりする時などに、テキストファイルを対象にした検索は役に立つ。