18

我有一个 XML 文件,该文件由一行组成。

我要做的是finalNumber通过 Putty 从文件中提取“”属性值。无需下载副本并使用 notepad++ 进行搜索。

我已经建立了一个我在在线工具上测试过的正则表达式,并尝试在sed命令中使用它来复制 grep 功能。该命令运行但不返回任何内容。

正则表达式:

(?<=finalNumber=")(.*?)(?=")

sed命令(不返回任何内容,预期为 28,请参阅文件提取):

sed -n '/(?<=finalNumber=")(.*?)(?=")/p' file.xml

文件提取:

...argo:finalizedDate="2012-02-09T00:00:00.000Z" argo:finalNumber="28" argo:revenueMonth=""...

我觉得我很接近(我可能是错的),我是在正确的路线上还是有更好的方法来实现输出?

4

5 回答 5

29

这里的好老 grep 没有错。

grep -E -o 'finalNumber="[0-9]+"' file.xml | grep -E -o '[0-9]+'

用于-E扩展正则表达式,并且-o只打印匹配的部分。

于 2013-01-23T12:26:57.283 回答
12

尽管您已经选择了答案,但您可以在纯 sed 中执行以下操作:

sed -n 's/^.*finalNumber="\([[:digit:]]\+\)".*$/\1/p' <test

输出:

28

这将用匹配号替换整行并打印(因为 p 将打印整行,因此您必须替换整行)

于 2013-01-23T16:28:51.713 回答
2

这可能对您有用(GNU sed):

sed -r 's/.*finalNumber="([^"]*)".*/\1/' file
于 2013-01-23T15:20:49.763 回答
1

sed不支持前瞻断言。Perl 确实如此:

perl -ne 'print $1 if /(?<=finalNumber=")(.*?)(?=")/'
于 2013-01-23T12:23:38.503 回答
-1

据我了解,这里不需要使用前瞻。试试这个

sed -n '/finalNumber="[[:digit:]]\+"/p'
于 2013-01-23T12:25:00.697 回答