Gostaria de passar isso por meio de um segundo grep
para removê-los:
grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'
O -v
inverte a correspondência, imprimindo linhas que não correspondem ao padrão e a -P
ativa as Expressões regulares compatíveis com Perl, que permitem usar look-behind negativo . Essa regex específica corresponderá a .js
, que não é precedida por debug
, o que significa que, como estamos invertendo as correspondências, somente os arquivos .js
serão impressos.
No entanto, como @QuestionOverflow apontou para os comentários, isso pode ter o efeito colateral indesejado de filtrar linhas que contêm OK
e js
, pois o grep -v
é aplicado ao Toda a saída, não apenas o nome do arquivo. Para evitar isso, basta adicionar dois pontos (é isso que o grep
usa para separar nomes de arquivo do conteúdo do arquivo):
grep -r --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js:'
Isso ainda falhará se a linha de entrada contiver foo.js:
ou se o nome do arquivo contiver :
. Então, com certeza, use uma abordagem diferente:
grep -Tr --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js\t'
O -T
faz com que grep
imprima uma tabulação entre o nome do arquivo e o conteúdo do arquivo. Então, se nós simplesmente adicionarmos um \t
ao final da regex, ele só será compatível com os nomes dos arquivos, e não com o conteúdo da linha.
Mesmo assim, usando find
pode fazer mais sentido, independentemente disso.