(Suponho que você pretendia que o segundo grep
correspondesse ao conteúdo da linha e não aos nomes dos arquivos, ou ambos, conforme sua abordagem estava sendo feita)
POSIXly:
find . -type f -exec awk '
FNR == 1 {found = 0}
!found && tolower($0) ~ /some string/ && /other string/ {
print FILENAME
found = 1
nextfile
}' {} +
A empresa sobre found
é para implementações awk que não suportam nextfile
ainda (e onde nextfile
é, então, um não operacional). Se você souber que sua implementação de awk
suporta nextfile
, você poderá simplificá-la para:
find . -type f -exec awk 'tolower($0) ~ /some string/ && /other string/ {
print FILENAME; nextfile}' {} +
Com o GNU grep
construído com suporte a PCRE, uma vez que você deseja que uma correspondência seja insensível a maiúsculas e minúsculas e não a outra:
grep -rlP '^(?=.*(?i:some string))(?=.*other string)' .
(?=...)
é um operador perl look-ahead . (?i:pattern)
ativa a correspondência sem distinção entre maiúsculas e minúsculas apenas para pattern
. Então, aqui estamos combinando no início da linha ( ^
), desde que seja seguido por qualquer número de caracteres ( .*
) seguido por some string
(insensível a maiúsculas) e também que ele (o início da linha) é seguido por qualquer número de caracteres e other string
(diferencia maiúsculas de minúsculas).
Se o grep
não der suporte a -P
, você poderá ter o comando pcregrep
(substitua grep -rlP
por pcregrep -rl
) ou, se os padrões não se sobrepuserem, você poderá fazer:
grep -rl -e '[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG].*other string' \
-e 'other string.*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]' .
Ou se você não quer que as duas correspondências sejam insensíveis a maiúsculas e minúsculas:
grep -ril -e 'some string.*other string' \
-e 'other string.*some string' .