Ich versuche, die Zeilen mit dem Wiederholungssymbol {n} zu drucken, aber es funktioniert nicht. Zum. Ich möchte zB alle Zeilen drucken, deren Länge 4 Zeichen lang ist
awk '/^.{4}$/' test_data
Mit dem obigen Code wird das nicht gedruckt. Wie kann ich das Problem beheben, damit ich das Wiederholungssymbol verwenden kann? Ich kenne die Alternative wie awk '/^....$/' test_data
undawk 'length ==3 ' test_data
awk
regular-expression
Für immer Lerner
quelle
quelle
awk '/^.{4}+$/{print}' <<<$'foods\nbaarsz\nfooo'
, genau 4 Zeichen entsprechen. Auch wie Sie selbst erwähnt haben,awk 'length($0) == 4' test_data
ist es mit fast allenawk
Versionen kompatibel .awk --re-interval '/^.{4}$/' test_data
oderawk --posix '/^.{4}$/' test_data
arbeitenAntworten:
Gemäß dem GNU Awk-Benutzerhandbuch: Funktionsverlauf wurde die Unterstützung für Bereichsoperatoren für reguläre Ausdrücke in Version 3.0 hinzugefügt, erforderte jedoch anfangs eine explizite Befehlszeilenoption
Neue Befehlszeilenoptionen:
In
gawk
4.0Da Sie
gawk
3.x verwenden, müssen Sie verwendenoder
oder (danke @ StéphaneChazelas) wenn Sie eine Lösung suchen, die portabel ist, verwenden Sie
(da
--posix
oder--re-interval
würde einen Fehler in anderenawk
Implementierungen verursachen).quelle
POSIXLY_CORRECT=anything awk '/^.{4}/'
portablen Code zu verwenden (--posix
oder--re-interval
würde in anderenawk
Implementierungen einen Fehler verursachen ).EREs ( erweiterte reguläre Ausdrücke, wie sie von
awk
oder verwendet werdenegrep
) hatten anfangs keine{x,y}
. Es wurde zuerst in BREs eingeführt (wie vongrep
oder verwendetsed
), jedoch mit einer\{x,y\}
Syntax, die die Rückwärtsportabilität nicht beeinträchtigt.Als es jedoch mit dieser
{x,y}
Syntax zu EREs hinzugefügt wurde, brach es die Rückwärtsportabilität, da einfoo{2}
RE zuvor mit etwas anderem übereinstimmte.Einige Implementierungen haben sich daher dagegen entschieden. Sie werden feststellen , dass
/bin/awk
,/bin/nawk
und/bin/egrep
auf Solaris ehren immer noch nicht (man braucht verwenden/usr/xpg4/bin/awk
oder/usr/xpg4/bin/grep -E
). Gleich fürawk
undnawk
auf FreeBSD (basierend auf demawk
von Brian Kernighan (thek
inawk
) gepflegten ).Für GNU
awk
mussten Sie es bis vor relativ kurzer Zeit (Version 4.0) mit aufrufen,POSIXLY_CORRECT=anything awk '/^.{4}$/'
um es zu ehren.mawk
ehrt es immer noch nicht .Beachten Sie, dass dieser Operator nur syntaktischer Zucker ist.
.{3,5}
kann....?.?
zum Beispiel immer geschrieben werden (obwohl natürlich{3,5}
viel besser lesbar ist und das Äquivalent von(foo.{5,9}bar){123,456}
viel schlechter wäre).quelle
Dies funktioniert wie erwartet mit GNU
awk
(gawk):Aber scheitert mit
mawk
dem näher an POSIXawk
und, AFAIK, ist der Standard auf Ubuntu-Systemen:Eine einfache Lösung wäre also die Verwendung
gawk
vonawk
. Die{n}
Notation ist nicht Teil der POSIX BRE-Syntax (Basic Regular Expression). Deshalbgrep
scheitert auch hier:Es ist jedoch Teil von ERE (Extended Regular Expressions):
Ich weiß nicht, welches Regex-Aroma von. Sie verwenden eine ältere Version von ERE gemäß Stéphanes Antwort . Entweder verwenden Sie anscheinend eine Versionmawk
POSIX verwendet wirdawk
, aber ich denke, es ist BREawk
, die ERE nicht implementiert, oder Ihre Eingabe enthält tatsächlich keine Zeilen mit genau 4 Zeichen. Dies kann beispielsweise an Leerzeichen liegen, die Sie nicht sehen, oder an Unicode-Glyphen.quelle
length($0)
was effizienter ist als reguläre Ausdrücke.mawk
ist nicht wirklich näher an POSIXawk
und verwendet keine BREs. Es werden EREs verwendet, jedoch ohne den{x,y}
Operator.