filepattern *.sh
важен для предотвращения проверки каталогов. Конечно, некоторые тесты могут это предотвратить.
for f in *.sh
do
a=$( grep -n -m1 abc $f )
test -n "${a}" && z=$( grep -n efg $f | tail -n 1) || continue
(( ((${z/:*/}-${a/:*/})) > 0 )) && echo $f
done
The
grep -n -m1 abc $f
ищет не более 1 соответствия и возвращает (-n) номер белья.
Если совпадение найдено (test -n ...), найдите последнее совпадение с efg (найдите все и возьмите последнее с tail -n 1).
z=$( grep -n efg $f | tail -n 1)
еще продолжить.
Поскольку в результате получается что-то вроде 18:foofile.sh String alf="abc";
, нам нужно сократить значение от ":" до конца строки.
((${z/:*/}-${a/:*/}))
Должен возвращать положительный результат, если последнее совпадение 2-го выражения прошло после первого совпадения первого.
Затем мы сообщаем имя файла echo $f
.