As versões recentes (-ish) do GNU grep têm uma opção -Z
, o que torna a saída não ambígua, mas é destinada principalmente a usos como grep -lZ … | xargs -0
. Ainda funciona se você estiver listando o conteúdo da linha, o byte nulo substitui o cólon e o conteúdo da linha ainda termina em uma nova linha¹, mas shells não são bons em lidar com bytes nulos, então você terá dificuldade em analisar essa saída .
Uma solução simples (com uma pequena penalidade de desempenho) é executar o grep em cada arquivo individualmente.
Outra solução é usar uma linguagem como Perl ou Python. Perl é muito bom em emular o grep; grep REGEX
é basicamente perl -ne '/REGEXP/ and print'
.
Mas você pode não precisar disso se a saída não for realmente ambígua. Por exemplo, se as linhas correspondentes não contiverem dois pontos, o nome do arquivo será tudo em uma linha até os últimos dois pontos. Se todas as linhas correspondentes começarem com SUCCESS
ou FAILURE
e essas palavras não aparecerem nos nomes dos arquivos, você poderá usar isso para localizar a separação, etc.
¹ Exceto quando usar -z
para filtrar registros terminados em nulo em vez de registros terminados por nova linha, então, null é o terminador de nome de arquivo e o terminador de resultado; sem -o
, a saída ainda não é ambígua, com registros de saída alternados sendo nomes de arquivos e registros correspondentes na saída.