Isso é um pouco complicado se você quiser considerar os termos que podem se sobrepor, por exemplo, uma única linha contendo banana
é suficiente para contar como um uso de ambos os ban
e nan
.
Aqui está um script perl minimamente testado, rápido e sujo. Ele lê as strings para pesquisar (as agulhas) e os nomes dos arquivos e, em seguida, cria uma expressão regular que corresponde a qualquer uma das agulhas. Quando encontra uma correspondência, ela remove a string correspondente do conjunto de agulhas e recria a regex. As agulhas que sobram no final são as que você procura.
#! /usr/bin/env perl
open FILENAMES, "<", "files_to_search.out" or die $!;
@filenames = <FILENAMES>;
close FILENAMES;
chomp foreach @filenames;
open NEEDLES, "<", "terms_to_search.out" or die $!;
@needles = <NEEDLES>;
close NEEDLES;
chomp foreach @needles;
%needles = map {$_, 1} @needles;
sub build_re {
$re = qr/(@{[join("|", map quotemeta, keys %needles)]})/;
}
@ARGV = @filenames;
while (<ARGV>) {
while (/$re/) {
delete $needles{$1};
exit if !%needles;
build_re();
}
}
print map "$_\n", sort keys %needles;