
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}
X
m
n
POSIX-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_CORRECT
Umgebungsvariable 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, sed
um 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 -r
spezifisch für GNU sed ist und sed anweist, erweiterte statt einfacher regulärer Ausdrücke zu verwenden. Andere Versionen sed
haben dies nicht oder verwenden -E
stattdessen 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 grep
Anweisung druckt jedes Vorkommen von Ziffern in einer separaten Zeile, während die perl
Anweisung 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 grep
und Perl.