![AWK negativer regulärer Ausdruck](https://rvso.com/image/97224/AWK%20negativer%20regul%C3%A4rer%20Ausdruck.png)
Ich bin auf der Suche nach einem regulären AWK-Ausdruck, der alle Zeichenfolgen ausgeben kann, die nicht mit einem bestimmten Wort übereinstimmen.
Die Verwendung /^((?!word \+).)*/
funktioniert in Java, aber nicht in AWK.
Sie erhalten den Fehler „Kompilierung fehlgeschlagen“. Durch Escapen der Klammern wird der Kompilierungsfehler behoben, aber die Übereinstimmung mit dem regulären Ausdruck ist nicht korrekt.
Es wäre toll, wenn jemand mit einem Awk-regulären Ausdruck helfen könnte.
Ich kann nicht benutzen string" !~ /regex/
Ich muss string" ~ /regex/
reguläre Ausdrücke verwenden, die für alle Zeichenfolgen außer einer bestimmten Zeichenfolge gültig sein sollten.
Zeichenfolgen, die Folgendes enthalten, domain
sollten herausgefiltert werden. Eingabe
This is domain test
This is do test
This is test
Ausgabe
This is do test
This is test
Muss nur mit regulären Ausdrücken gemacht werden. Der Awk-Code kann nicht geändert werden.
in AWK ist es wiestring" ~ /regex/
Um dies zu erreichen, kann daher nur ein regulärer Ausdruck übergeben werden.
Antwort1
Die Antwort von Thomas Dickey ist zwar klug, es gibt jedoch eine richtige Vorgehensweise:
awk '!/domain/ {print}' <<EOF
This is domain test
This is do test
This is test
EOF
This is do test
This is test
Antwort2
In awk tun Sie dies, indem Sie ein Muster schreiben, das dem entspricht, was Sieausschließenund machen Sie seineAktion next
. Es bleiben die zu verarbeitenden Zeilen übrig, die die Negation des Musters darstellen, das Sie erreichen möchten.
Etwas wie das:
/regex/{ next; }
{ print; }
Oder wenn Ihr Skript komplizierter ist und Sie Folgendes nicht verwenden können next
:
<<<'the quick brown fox jumps over the lazy dog'$'\n''pack my box with five dozen liquor jugs' awk '
{ negate=0 }
/box/{ negate=1 }
negate==1 { gsub(/[aeiou]/, "%") }
negate==0 { gsub(/[aeiou]/, "#") }
{ print NR, $0; }
'
# output
1 th# q##ck br#wn f#x j#mps #v#r th# l#zy d#g
2 p%ck my b%x w%th f%v% d%z%n l%q%%r j%gs
Antwort3
Weil du gesagt hast„Muss nur mit regulären Ausdrücken zu tun haben. Der Awk-Code kann nicht geändert werden.“Versuche dies:
Anstelle von „Negation des Operators“ können Sie auch „Negation des regulären Ausdrucks“ verwenden.. Du musst nur bestehenNegationssymbol!
als Teil des regulären Ausdrucks !/domain/
zum AWK-Skript.
awk '{if ($0 ~ !/domain/) {print $0}}'
Antwort4
Das Schreiben eines negierten Musters mit erweiterten POSIX-regulären Ausdrücken ist besonders knifflig. Für diesen Fall einer Zeichenfolge wie , domain
bei der alle Zeichen unterschiedlich sind, können Sie Folgendes versuchen:
awk -v re="^([^d]|d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]\
*o(d*d[^do]|[^dm])|[^da])|[doma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom\
]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[^di])|[domai]*i(d*d[^do]|[d\
o]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[^da])|[do\
ma]*a(d*d[^do]|[do]*o(d*d[^do]|[^dm])|[dom]*m(d*d[^do]|[do]*o(d*d[^do]|\
[^dm])|[^da])|[^di])|[^dn]))*[domai]*\$" '$0 ~ re'
Ich habe mir das vor Jahren ausgedacht und bin darauf zurückgekommen.dieser Artikel von mirimmer wenn ich einen negativen regulären Ausdruck schreiben muss, aber ich muss zugeben, dass ich nicht mehr weiß, wie ich dazu gekommen bin.