
特定のディレクトリとそのサブディレクトリにあるファイルで、特定のファイル拡張子を持つファイル内にある行のみを検索するスクリプト (script1.sh とします) を作成しようとしています。./script1.sh python py this.is.what.i.look.for
次のような結果が返されるはずです。
python/abc/file1.py:11: this.is.what.i.look.for and the line can contain other things as well
python/file2.py:412: this.is.what.i.look.for this.toggleButton.getElement())
grep -r を使用してサブディレクトリ内を検索し、行を見つけることができました。
grep -r -e $3 $1
行は表示されますが、異なるファイル拡張子を持つ他のファイルを除外できず、コードに $2 を含める方法も見つかりませんでした。また、行番号を中央に配置することもできませんでした。出力を次のように 2 つの部分に分割しようとしましたpython/abc/file1.py:
this.is.what.i.look.for and the line can contain other things as well
がawk -F " " '{print $1}
、元に戻すことができませんでした。grep 関数の出力の一部を変数に割り当ててから元に戻したかったのですが、これも失敗しました。t1="grep -r -e $3 $1 | awk -F " " '{print $1}'"
どれを使用すればよいか分からなかったので、" "、' '、$() を使用して値を割り当てようとしましたが、どれも機能しませんでした。
答え1
少なくとも GNU ではgrep
、シェル スタイルの glob 式を使用して、 --include
(および--exclude
) を使用して再帰 grep での一致を制限できます。
grep -r --include='*.py' -e pattern dir
-n
または を追加し--line-number
て番号を追加できます。最後に、位置パラメータを引用符で囲むことを忘れないでください。
grep -nr --include="*.$2" -e "$3" "$1"