awk 'NR == 2 || NR == 3 {l = l RS $0; next}
NR == 5 {$0 = $0 l}
{print}'
find src/ -type f -name '*.js' -exec grep -Hn -E -- 'filter\(|map\(' {} + |
awk -F: '{printf "%-100s%-5s%-100s\n", $1, $2, substr($0, length($1) + length($2) + 3)}'
Параметр -H
для grep
заставит его печатать имя файла, даже если он вызывается с одним файлом в качестве аргумента. Опция -type f
для поиска нужна для того, чтобы пропускать неработающие ссылки и каталоги, которым посчастливилось называться *.js
.
Или, что еще проще, полностью избавьтесь от grep (спасибо @don _crissti за предложение):
find src/ -type f -name '*.js' -exec awk '/filter\(|map\(/{printf "%-100s%-5s%-100s\n", FILENAME, FNR, $0}' {} +
man
делает это немного неясным. «Сканирование остановится при первом совпадении» -указывает, что все имена файлов будут напечатаны, но сканирование совпадающего слова остановится при первом совпадении. Страница GNU grep man поясняет это:
-l
--files-with-matches
Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning of each file stops on the first match. (-l is specified by POSIX.)
Вот пример:
$grep -iR Intel *
2018/jan/cpu.txt:Intel i9
2018/motherboard.txt:Intel Motherboard
hardware.txt:Intel Corei7
#the same result as you provided;
$grep -iRl Intel *
2018/jan/cpu.txt
2018/motherboard.txt
hardware.txt
#the desired result