Um and
zusammen mehrere Suchen, verwenden Sie mehrere Behauptungen Look-Ahead, eine pro Sache für abgesehen sah von dem zuletzt:
statt schreiben
grep -P A * | grep B
Sie
grep -P '(?=.*A)B' *
grep -Pr '(?=.*db-connect\.php)version' .
schreiben
Nicht schreiben
grep -P 'A.*B|B.*A' *
, weil das nicht auf Überschneidungen, während die (?=…)(?=…)
Technik nicht der Fall ist.
Sie können auch in NOT
Operatoren hinzufügen. Um nach Zeilen zu suchen, die nicht mit X
übereinstimmen, verwenden Sie normalerweise -v
in der Befehlszeile. Aber Sie können das nicht tun, wenn es Teil eines größeren Musters ist. Wenn dies der Fall ist, fügen Sie dem Muster (?=(?!X).)*$)
hinzu, um irgendetwas mit X
darin auszuschließen.
Also stellen Sie sich vor, Sie wollen Linien mit allen drei von A, B und dann entweder von C oder D, aber, die nicht X oder Y in ihnen haben übereinstimmen.Alles, was Sie brauchen, ist dies:
grep -P '(?=^.*A)(?=^.*B)(?=^(?:(?!X).)*$)(?=^(?:(?!Y).)*$)C|D' *
In einigen Shells und in einigen Einstellungen. Du musst der !
entkommen, wenn es dein history-substitution Charakter ist.
Dort, ist das nicht ziemlich cool?
Sie nur zwei greps tun könnte. Eins für ein Wort und eins für das andere und dann finden Sie die Schnittmenge der passenden Dateien. Es ist nicht * so * trivial, aber ich weiß nicht, ob es einen besseren Weg gibt, es zu tun. –