【发布时间】:2018-08-17 12:13:50
【问题描述】:
我想使用 awk 打印匹配的模式。不是场,不是线。
在 vi 中,您可以将匹配的模式放在替换中,方法是用括号括起来并用花括号和数字引用它,如下所示:
: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 在哪里放什么?
这还能做到吗?
【问题讨论】:
-
我发现最接近我想要的就是这个化合物:grep 'bufId="[0-9]*"' | sed 's/^.*bufId="//' | sed 's/([0-9]*)".*$/\1/'
-
您可以只使用 XML 解析器并在一行中实现它!这也将提供更强大的解决方案,以防您有另一个属性
evilAttribute包含像bufld这样的值,例如可能会欺骗awk或sed