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 -l
imprimirá apenas os nomes dos arquivos que tiverem algum dos padrões desejados. Se você quiser imprimir as correspondências também, use-H
em 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")" .