2012-10-21 7 views
6

Jestem pewien, że to jest łatwe, więc przepraszam. W Perl może zrobić coś jakSkładnia awk do uzyskania części dopasowanego regex

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

tj użyć nawiasów w regex, aby móc odnieść się do części meczu później jako $ 1, $ 2 itd Jaki jest odpowiednik w awk?

Odpowiedz

5

GNU awk że byłoby:

$ 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 

Innymi awk trzeba by użyć [g] sub() i/lub match() i/lub substr() w zależności od tego, co w przeciwnym razie nie chcesz się dopasować. Na przykład:

$ 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 

należałoby trzeciego argumentu o „RLENGTH długości («foo =»)” na substr() zadzwonić jeśli wzorzec docelowy nie znajduje się na końcu linii. Zmodyfikuj "foo =" jako zmienną, jeśli chcesz i jeśli sama może zawierać RE, musisz wykonać kilka dodatkowych kroków.

1

Dlaczego po prostu nie używać sed?

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

EDIT: Jeśli naprawdę trzeba użyć awk będziesz musiał użyć sub lub gsub. See here.

+0

Dzięki, nie zdawałem sobie sprawy, że sed może to zrobić. – gimmeamilk

+1

Pamiętaj, że "+" to meta-znak ERE, a wiele "sed" domyślnie obsługuje tylko BRE. Aby rozwiązanie było przenośne dla wszystkich sedów, musiałbyś zamiast tego użyć [0-9] [0-9] *. –

4

Również z GNU awk, użyj match() function i przechwytuj grupy nawiasów w tablicy.

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

Może trochę za późno na imprezę, ale jak traktować "=" jako separator pól? Pracowałem dla mnie!

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