Alternativer regulärer Ausdruck für {}

Alternativer regulärer Ausdruck für {}

Ich versuche, diese Zeile vollständig zu ersetzen, aber die Zahlen:

looktype="123"

es werden also nur die Zahlen angezeigt.

Ist dies auf einfache Weise möglich?

{sub ("look type=\"[0-9]{0,3}", "TEST")}

Ich versuche dies mit awk, ohne Erfolg. Ich glaube, „sub“ und {0, 3} stören.

Antwort1

Inerweiterte reguläre Ausdrücke(ERE) bedeutet „repeated between and times“. Awk implementiert erweiterte reguläre Ausdrücke, allerdings hatten historische Implementierungen von awk diese Klammern-Syntax für Wiederholungsintervalle nicht. DieX{m,n}XmnPOSIX-Standardgibt an, dass awk ERE unterstützen muss, aber viele vorhandene Implementierungen sind nicht kompatibel.

Mit GNU awkIntervallewerden erst seit Version 4.0 unterstützt. Bei älteren Versionen können Sie gawk POSIX-kompatibel machen, indem Sie die POSIXLY_CORRECTUmgebungsvariable auf einen nicht leeren Wert setzen:

POSIXLY_CORRECT=1 awk '{sub ("looktype=\"[0-9]{0,3}", "TEST"); print}'

Die Standardversion von awk ist bei einigen Distributionen nicht gawk, sondern mawk, das kleiner und schneller ist. Mawk unterstützt keine Klammerausdrücke.Dafür gibt es einen Patch, aber da Mawk nicht gepflegt wird, ist seine Akzeptanz gering.

Wenn die Anzahl der Wiederholungen gering ist, können Sie es buchstabieren:

awk '{sub ("looktype=\"[0-9]?[0-9]?[0-9]?[0-9]?", "TEST"); print}'

Antwort2

Sie könnten es weiterleiten, sedum nur das zu extrahieren, was zwischen den Anführungszeichen steht.

z.B

$ echo 'looktype="123"' | sed -r -e 's/^.*"([^"]+)".*/\1/'
123

Beachten Sie, dass dies -rspezifisch für GNU sed ist und sed anweist, erweiterte statt einfacher regulärer Ausdrücke zu verwenden. Andere Versionen sedhaben dies nicht oder verwenden -Estattdessen möglicherweise. Andernfalls schreiben Sie es in POSIX Basic Regular Expression (BRE) wie folgt:

sed -e 's/^.*"\([^"][^"]*\)".*/\1/'

Antwort3

In awk(unter der Annahme, dassgenauEingabe, die Sie gepostet haben), können Sie auch Folgendes tun:

awk -F'=' '{print $2}' | sed 's/"//g'

Antwort4

Eine Alternative in GNU grep(von der ich aufgrund des Ubuntu-Tags annehme, dass Sie sie haben):

grep -o '[0-9]\+' your_file

Eine noch portablere Alternative mit Perl

perl -nle '/([0-9]+)/ and print $1' your_file

Die beiden Alternativen sind nicht genau gleich. Sie verhalten sich unterschiedlich, wenn Sie mehrere Instanzen einer Ziffernfolge in derselben Zeile haben. Die grepAnweisung druckt jedes Vorkommen von Ziffern in einer separaten Zeile, während die perlAnweisung nur das am weitesten links stehende Vorkommen einer Ziffernfolge in jeder Zeile druckt. Dies liegt an den Unterschieden in der internen Implementierung der regulären Ausdrucks-Engine zwischen grepund Perl.

verwandte Informationen