2012-10-21 4 views
6

Bin sicher, das ist einfach, also Entschuldigung. In Perl könnte ich so etwas wieawk Syntax für den Erhalt eines Teils einer passenden Regex

my $str = "foo=23"; 
$str ~= m/foo=([0-9]+)/ 
print "foo value is " . $1 

dh Verwendung Klammern in der regex tun zu können, Teil des Spiels verweisen später als $ 1, $ 2 usw. Was die äquivalent in awk ist?

Antwort

5

In GNU awk das wäre:

$ cat tst.awk 
BEGIN { 
    str = "foo=23" 
    val = gensub(/foo=([0-9]+)/,"\\1","",str) 
    print "foo value is " val 
} 
$ 
$ gawk -f tst.awk 
foo value is 23 

In anderen awk die Sie würden verwenden müssen [g] sub() und/oder Spiel() und/oder substr(), je nachdem, was sonst willst/willst du nicht aufpassen. Zum Beispiel:

$ cat tst.awk 
BEGIN { 
    str = "foo=23" 
    val = substr(str,match(str,/foo=[0-9]+/)+length("foo=")) 
    print "foo value is " val 
} 
$ awk -f tst.awk 
foo value is 23 

Sie würden eine dritte arg von benötigen ‚RLENGTH-Länge (‚foo =‘)‘ auf der substr() aufrufen, wenn das Zielmuster nicht am Ende einer Zeile ist. Machen Sie "foo =" eine Variable, wenn Sie möchten, und wenn sie selbst eine RE enthalten kann, sind noch ein paar Schritte notwendig.

1

Warum nicht einfach sed verwenden?

echo 'foo=23' | sed 's/foo=\([0-9]\+\)/foo value is \1/' 

EDIT: Wenn Sie wirklich awk verwenden müssen Sie sub oder gsub verwenden. See here.

+0

Danke, ich wusste nicht, sed könnte dies tun. – gimmeamilk

+1

Bitte beachten Sie, dass "+" ein ERE Meta-Zeichen ist, und viele "sed" s standardmäßig nur BREs unterstützen. Für eine Lösung, die zu allen sds portierbar ist, müssten Sie stattdessen [0-9] [0-9] * verwenden. –

4

Auch mit GNU awk, verwenden Sie die match() function und erfassen Sie die Klammern Gruppen in einem Array.

str = "foo=23" 
match(str, /foo=([0-9]+)/, ary) 
print "foo value is " ary[1] 
1

Vielleicht ein bisschen spät für die Party, aber wie wäre es mit '=' als Feldtrenner? Arbeitete eine Belohnung für mich!

echo foo=23 | awk -F= '{ print $1 " value is " $2 }'