
Я пытаюсь написать скрипт (скажем, 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
with awk -F " " '{print $1}
, но не смог собрать их обратно. Я хотел присвоить части вывода функции grep переменным, а затем собрать их обратно, но и это не сработало. t1="grep -r -e $3 $1 | awk -F " " '{print $1}'"
Я попытался использовать " ", ' ' ,$() для присвоения значений, так как я не знал, какой из них использовать, но ни один из них не сработал.
решение1
По крайней мере grep
, в GNU вы можете использовать --include
(и --exclude
) для ограничения совпадений в рекурсивном grep, используя выражение glob в стиле оболочки:
grep -r --include='*.py' -e pattern dir
Вы можете добавить -n
или --line-number
добавить нумерацию. Наконец, не забудьте указать позиционные параметры - так
grep -nr --include="*.$2" -e "$3" "$1"