7

我相信这很容易,所以很抱歉。在 Perl 我可能会做类似的事情

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

即在正则表达式中使用括号可以稍后将匹配的部分引用为$1、$2 等。awk 中的等价物是什么?

4

4 回答 4

6

同样使用 GNU awk,使用该match()函数并将括号组捕获到一个数组中。

str = "foo=23"
match(str, /foo=([0-9]+)/, ary)
print "foo value is " ary[1]
于 2012-10-21T18:12:39.733 回答
5

在 GNU awk 中是:

$ 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

在其他 awk 中,您需要使用 [g]sub() 和/或 match() 和/或 substr() ,具体取决于您要/不想匹配的其他内容。例如:

$ 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

如果目标模式不在行尾,则在 substr() 调用中需要第三个参数 ',RLENGTH-length("foo=")'。如果您愿意,可以将“foo=”设置为变量,并且如果它本身可以包含 RE,则需要执行更多步骤。

于 2012-10-21T16:04:11.573 回答
1

为什么不直接使用sed

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

编辑:如果你真的需要使用awk,你必须使用subor gsub看这里。

于 2012-10-21T15:26:13.637 回答
1

聚会可能有点晚了,但是将“=”视为字段分隔符怎么样?对我来说是一种享受!

echo foo=23 | awk -F= '{ print $1 " value is " $2 }'
于 2014-07-07T11:47:38.500 回答