Предположим, что мы выполняем многострочный поиск по шаблону регулярных выражений в кучке файлов, и мы хотим извлечь совпадения из grep. По умолчанию выходные значения grep разделяются символами новой строки, но поскольку мы делаем многострочные шаблоны, это создает неудобства, из-за которых мы не можем легко извлечь отдельные совпадения.Как сделать вывод grep отдельным символом NULL?
Пример
grep -rzPIho '}\n\n\w\w\b' | od -a
В зависимости от файлов в вашем дереве файлов, это может привести выход как
0000000 } nl nl m y nl } nl nl i f nl } nl nl m
0000020 y nl } nl nl m y nl } nl nl i f nl } nl
0000040 nl m y nl
0000044
Как вы можете видеть, мы не можем разделить на переводы строк, чтобы получить спички для дальнейшей обработки , так как совпадения содержат символы новой строки.
Что не работает
Сейчас на --null
(или -Z
) работает только в сочетании с -l
, что делает Grep только список имен файлов вместо матчей, так что здесь не поможет.
Обратите внимание, что это не дубликат Is there a grep equivalent for find's -print0 and xargs's -0 switches?, так как требования к этому вопросу различны, что позволяет ему отвечать альтернативными методами.
Итак, как мы можем сделать эту работу? Может быть, использовать grep в сочетании с другими инструментами?
Я собираюсь пойти с «вы не можете» здесь, если 'grep' сам не может сделать это для вас (и кто скажет, что у вас нет' NUL' в ваших совпадающих данных для начала) , Вы уже злоупотребляли 'grep', чтобы сделать эту работу уже. Я либо использовал вывод «od» (или аналогичный), либо использовал инструмент, отличный от 'grep', который вы могли бы лучше контролировать вывод (' awk' или 'perl' или что-то еще). –
Кортеж имени файла, смещения байта и длины совпадения позволит вам собирать фактические совпадения, когда они вам понадобятся. Я не думаю, что это выполнимо с 'grep', но реализация этого в Python или Perl не должна быть трудной. – tripleee
Можете ли вы добавить образец текста к вашему вопросу и ожидаемый результат? Я также рекомендовал бы использовать 'awk' для этого. – miken32