在awk中使用匹配的模式

时间:2018-03-09 01:00:50

标签: regex awk

我想用awk打印匹配的模式。不是领域,不是线。

在vi中,你可以将匹配的模式放在替换中,用parens包围它并用花括号和数字引用它,如下所示:

:s/bufid=([0-9]*)/buffer id is {\0}/

parens之间匹配的部分会被记住并可以使用。

在perl中,它是类似的

$_ = "Hello there, neighbor";
if (/\s(\w+),/) {             # memorize the word between space and comma
  print "the word was $1\n";  # the word was there
}

有什么方法可以用awk做类似的事情吗?我只想提取缓冲区ID并打印它,只有它。

输入行是XML,并且将包含(除此之外)'bufId =“123456”'。我想打印“123456”

所以......

awk < file.xml '/bufId="([0-9]*)"/ { print X; }'

我把X放在哪里?

甚至可以这样做吗?

4 个答案:

答案 0 :(得分:3)

gawk

awk '{print gensub(/.*bufId="([0-9]*)"/,"\\1",1)}'

如果您想要引用结果,您还必须捕获引号。

答案 1 :(得分:2)

这似乎与你所追求的非常近似。不确定awk是否是您最好的工具。

echo '<root><a bufId="123456"/></root>' | awk 'match($0, /bufId="/) { print substr($0, RSTART+7, RLENGTH-1)}'

This是一个有用的起点。

答案 2 :(得分:1)

同样使用gawkmatch中的第三个参数是特定的):

~/test£ cat test
abc
~/test£ gawk '{ match($0, /a(.)(.)/, group)}{ print group[2] group[1]}' test
cb

答案 3 :(得分:1)

我强烈建议您使用awk解析器,而不是针对此XML解决方案:

$ cat file.xml
<elems><elem bufId="123456"/></elems>

$ xmllint --xpath "concat('\"',string(//elem/@bufId),'\"')" file.xml
"123456"

$ xmllint --xpath "string(//elem/@bufId)" file.xml
123456

取决于您是否希望在输出中包含引号。

另一个有效的解决方案是使用sed(如果你真的不喜欢XPATH和XML解析器,并且因为已经有很多好的awk解决方案,我也将介绍这个解决方案):

$ sed -n 's/^.*bufId="\([0-9]*\)".*$/\1/gp' file.xml
123456

$ sed -n 's/^.*bufId="\([0-9]*\)".*$/"\1"/gp' file.xml
"123456