Je voudrais simplement passer cela une seconde grep
pour les supprimer:
grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'
L' -v
inverse la correspondance, l'impression de lignes qui ne correspondent pas au motif et -P
permet les expressions régulières compatibles Perl qui nous permettent d'utiliser des lookbhinds négatifs . Cette expression régulière particulière correspondra à ce .js
qui n'est pas précédé par debug
quel moyen (puisque nous inversons les correspondances) que seuls ces .js
fichiers seront imprimés.
Cependant, comme l'a souligné @QuestionOverflow dans les commentaires, cela pourrait avoir pour effet secondaire inattendu de filtrer les lignes qui contiennent OK
et js
puisque le grep -v
est appliqué à la sortie entière, pas seulement le nom du fichier. Pour éviter cela, ajoutez simplement deux points (c'est ce qui permet grep
de séparer les noms de fichier du contenu du fichier):
grep -r --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js:'
Cela échouera toujours si votre ligne d'entrée contient foo.js:
ou si votre nom de fichier contient :
. Donc, pour être sûr, utilisez une approche différente:
grep -Tr --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js\t'
Les -T
causes grep
pour imprimer un onglet entre le nom de fichier et le contenu du fichier. Donc, si nous ajoutons simplement un \t
à la fin de l'expression régulière, il ne correspondra qu'aux noms de fichiers et non au contenu de la ligne.
Néanmoins, l' utilisationfind
pourrait avoir plus de sens malgré tout.
OK
et.js
sur la même ligne?