вывести строки файла, соответствующие шаблону рекурсивно, за исключением нескольких папок (BASH) - PullRequest
0 голосов
/ 18 марта 2020

Я хотел бы написать bash скрипт для:

, чтобы принять REGEX для соответствия. Найти все файлы в текущем каталоге и, в конце концов, в подкаталогах (если указан -r), содержащих это слово. Печать -n LINES после сопоставленного регулярного выражения. Необязательно: исключить несколько каталогов или файлов по расширениям.

пример:

./dir
    |- file_1
    |- file_2
    |- subDir1 
          |- file_3
          |- node_modules (subDir)
          |- bin (subDir)

выполняется

myscript -w 'TODO' -r -d '<list of excluded dir>' -x <list of excluded extensions file>' -l '<lines inside file after where i found word to be printed>

В нем должны быть напечатаны все строки внутри файлов с TODO .

я использую что-то вроде:

if [ "$RECURSIVE" -eq 1 ]; then
    grep -rw "./" -A $LINES -e "$WORD" --exclude $dirs 
fi

проблема в том, что я не знаю, как передать список каталогов и файлов внутри bash, чтобы исключить grep , Я попытался с помощью регулярного выражения

dirs="(node_modules|bin)"

, но grep не читает его.

Еще одно требование - распечатать данные последней модификации файла

на данный момент, что я получаю, это просто:

./file1_path: line1
./file1_path: line2
...

Я хотел бы получить:

./file_path | last_modification_date | line_string
...

с исключенным расширением dirs и расширением файлов.

Я пытался выполнить это с помощью find + grep, но мне сложно объединить команды. Теперь я застрял на этом:

find . -maxdepth $MAXDEPTH -type f -exec ls -lah {} | gawk '{print "<here the infos to extract (filename data )>"}'\; -exec grep "$WORD" -A 4 {} \;

но это создает проблему в трубопроводе с gawk, я получаю:

gawk: row com.:1: ./file_1
gawk: row com.:1: ^ syntax error
gawk: row com.:1: ./file_1
gawk: row com.:1:   ^ regular expression not complete

И нет вывода для второго -exec команда:

пока без gawk все работает нормально:

-rwxr-xr-x 1 linux linux 2,4K mar 19 10:30 ./todo_checker  <=== THIS LINE
# Following program check search for TODO's in file your working on. 
# It is useful when you're a working on a large software and spread 
# TODO's over the files. 
#
# It check for TODO's and print: 
# file_name | file_location | file_last_modification
# n lines after todo
#
# parameters: 

я бы хотел сделать предварительный вывод THISLINE

...