Ich richte in Google Analytics einige Ziele ein und könnte ein wenig Regex-Hilfe gebrauchen.
Nehmen wir an, ich habe 4 URLs
http://www.anydotcom.com/test/search.cfm?metric=blah&selector=size&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah2&selector=style&value=1
http://www.anydotcom.com/test/search.cfm?metric=blah3&selector=size&value=1
http://www.anydotcom.com/test/details.cfm?metric=blah&selector=size&value=1
Ich möchte einen Ausdruck erstellen, der jede URL identifiziert, die die Zeichenfolge selector = size enthält, aber NICHT details.cfm enthält
Ich weiß, dass ich diesen Ausdruck verwenden kann, um eine Zeichenfolge zu finden, die KEINE andere Zeichenfolge enthält:
(^((?!details.cfm).)*$)
Ich bin mir jedoch nicht sicher, wie ich den Abschnitt selector = size hinzufügen soll.
Jede Hilfe wäre sehr dankbar!
Dies sollte es tun:
^(?!.*details\.cfm).*selector=size.*$
^.*selector=size.*$
sollte klar genug sein. Das erste Bit, (?!.*details.cfm)
ist ein negativer Look-Ahead: Bevor der String abgeglichen wird, wird geprüft, ob der String "details.cfm" enthält (mit einer beliebigen Anzahl von Zeichen davor).
regex könnte sein (Perl-Syntax):
`/^[(^(?!.*details\.cfm).*selector=size.*)|(selector=size.*^(?!.*details\.cfm).*)]$/`
^(?=.*selector=size)(?:(?!details\.cfm).)+$
Wenn Ihre Regex-Engine posessive Quantifizierer unterstützt (obwohl ich vermute, dass Google Analytics dies nicht tut), ist die Leistung bei großen Eingabesätzen vermutlich besser:
^[^?]*+(?<!details\.cfm).*?selector=size.*$
Ich suchte nach einer Möglichkeit, um zu vermeiden, dass in einer ähnlichen Situation wie im OP und in der für mich optimalen Lösung von Kobi ein Zeilenpuffer auf einem Schwanz liegt. In meinem Fall ohne Zeilen mit entweder "bot" oder "spider", während '/' (für mein Root-Dokument) eingefügt wird.
Mein ursprünglicher Befehl:
tail -f mylogfile | grep --line-buffered -v 'bot\|spider' | grep ' / '
Jetzt wird (mit "-P" Perl-Schalter):
tail -f mylogfile | grep -P '^(?!.*(bot|spider)).*\s\/\s.*$'