我想用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放在哪里?
甚至可以这样做吗?
答案 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)
同样使用gawk
(match
中的第三个参数是特定的):
~/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