Всем доброго времени суток!
Имеется директория, содержащая несколько поддиректорий, некоторые из которых тоже содержат поддиректории. Все это хозяйство набито текстовыми файлами, общим числом где-то под тысячу. Требуется инструмент для контроля вхождений некоторого шаблона в эти файлы. Проблема в том, что отдельные вхождения могут быть закомментированы по правилам Си, т.е. возможны однострочные (//…), и многострочные (/*** … ***/) комменты, которые надо игнорировать.
Выходной формат этого инструмента должен включать путь до файла, в котором найдено вхождение шаблона, номер строки с ним и собственно строку. Подробно поясняю чтобы было понятнее, для чего весь огород.
Итак, инструмент:
grep -IHrn . $SRC | sed '/\/\*.*\*\// d; /\/\*/,/\*\// d; s://.*$::' | grep -w $SHAB
где $SRC - источник, $SHAB - искомый шаблон (текстовая строка без пробелов).
Первый grep по сути только выводит каждый файл построчно и вставляет в начало строк путь к файлу и номер строки. Второй grep выполняет селекцию. А вот sed убирает все комменты из вывода: первая секция - однострочные длинные, вторая - многострочные длинные, третья - однострочные типа //.
И вот тут интересный эффект: если SRC - одиночный файл или небольшая поддирка - все работает правильно. Если SRC большой каталог - часть вывода пропадает, походу из файлов в конце списка. Если убрать sed и оставить grep... | grep... то вывод всегда полный, но с комментами, а с sed-ом - неполный. Проверено на эталонных шаблонах в эталонных файлах.
Кто-нибудь может объяснить что происходит и как с этим бороться без лишней заморочки с разделением на подкаталоги? Я предполагаю что sed не успевает обрабатывать вывод grep-а, захлебывается и в канале теряются буфера.







