Com as versões mais recentes do GNU grep (que tem a opção -z ), você pode usar este forro:
find . -type f -exec grep -lz 'this[[:space:]]*is[[:space:]]*some[[:space:]]*text' {} +
Considerando que os espaços em branco podem estar entre as palavras apenas.
Se você quiser pesquisar todos os arquivos recursivamente a partir do diretório atual, não precisará de find , basta usar grep -r (recursivo). find pode ser usado para ser seletivo nos arquivos a pesquisar, por ex. escolha arquivos de qual diretório excluir. Então, simplesmente:
grep -rlz 'this[[:space:]]*is[[:space:]]*some[[:space:]]*text' .
-
O principal truque aqui é
-z, ele tratará cada linha de fluxo de entrada terminada em ASCII NUL em vez de nova linha, como resultado, podemos combinar novas linhas usando métodos usuais. -
O padrão de classe de caractere
[[:space:]]indica qualquer caractere de espaço em branco, incluindo espaço, tabulação, CR, LF etc. Portanto, podemos usá-lo para corresponder a todos os caracteres em branco que podem aparecer entre as palavras. -
grep -limprimirá apenas os nomes dos arquivos que tiverem algum dos padrões desejados. Se você quiser imprimir as correspondências também, use-Hem vez de-l.
Por outro lado, se os espaços em branco puderem vir em qualquer lugar e não nas palavras, isso perderá sua boa aparência:
grep -rlz
't[[:space:]]*h[[:space:]]*i[[:space:]]*s[[:space:]]*i[[:space:]]*\
s[[:space:]]*s[[:space:]]*o[[:space:]]*m[[:space:]]*e[[:space:]]*\
t[[:space:]]*e[[:space:]]*x[[:space:]]*t' .
Com a opção -P (PCRE), você pode substituir o [[:space:]] por \s (isso pareceria muito melhor):
grep -rlzP 't\s*h\s*i\s*s\s*i\s*s\s*s\s*o\s*m\s*e\s*\
t\s*e\s*x\s*t' .
Usar a sugestão do @ steeldriver para obter sed para gerar o padrão para nós seria a melhor opção:
grep -rlzP "$(sed 's/./\s*&/2g' <<< "thisissometext")" .