Ich würde das nur eine Sekunde durchgehen grep
, um sie zu entfernen:
grep -r --exclude={\*~,\*.map} "OK" bar/ | grep -vP '(?<!debug)\.js'
Das -v
kehrt die Übereinstimmung um, druckt Linien, die nicht mit dem Muster übereinstimmen, und aktiviert-P
Perl-kompatible reguläre Ausdrücke, mit denen wir negative Lookbehinds verwenden können . Diese besondere regex wird übereinstimmen , .js
das ist nicht von prececeded debug
welche Mittel (da wir die Spiele sind invertiert) , die nur die .js
Dateien gedruckt werden.
Wie @QuestionOverflow in den Kommentaren hervorhob, könnte dies jedoch den unbeabsichtigten Nebeneffekt haben, Zeilen herauszufiltern , die enthalten OK
und js
da das grep -v
auf die gesamte Ausgabe angewendet wird, nicht nur den Dateinamen. Um dies zu vermeiden, fügen Sie einfach einen Doppelpunkt hinzu (dies wird grep
verwendet, um Dateinamen vom Dateiinhalt zu trennen):
grep -r --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js:'
Dies schlägt immer noch fehl, wenn Ihre Eingabezeile enthält foo.js:
oder wenn Ihr Dateiname enthält :
. Verwenden Sie also natürlich einen anderen Ansatz:
grep -Tr --exclude={*~,*.map} "OK" bar/ | grep -vP '(?<!debug).js\t'
Die -T
Ursachen grep
für das Drucken einer Registerkarte zwischen dem Dateinamen und dem Dateiinhalt. Wenn wir also einfach ein \t
am Ende der Regex hinzufügen , stimmt es nur mit den Dateinamen überein und nicht mit dem Inhalt der Zeile.
Trotzdem ist die Verwendungfind
möglicherweise sinnvoller.
OK
und.js
dieselbe Zeile enthalten?