在bash中使用SED打印RegEx匹配

时间:2013-01-23 12:16:51

标签: regex linux bash sed

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

我要做的是通过Putty从文件中提取“finalNumber”属性值。而不是必须使用记事本++下载副本和搜索。

我已经构建了一个我在On-line Tool上测试过的正则表达式,并尝试在sed命令中使用duplicate grep functionality。该命令运行但不返回任何内容。

正则表达式:

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

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

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

文件提取:

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

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

5 个答案:

答案 0 :(得分:18)

这里好老grep没有错。

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

使用-E表示扩展正则表达式,-o仅打印匹配部分。

答案 1 :(得分:8)

虽然你已经选择了一个答案,但这是一种纯sed的方法:

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

输出:

28

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

答案 2 :(得分:2)

这可能适合你(GNU sed):

sed -r 's/.*finalNumber="([^"]*)".*/\1/' file

答案 3 :(得分:1)

sed不支持预见断言。不过Perl确实如此:

perl -ne 'print $1 if /(?<=finalNumber=")(.*?)(?=")/'

答案 4 :(得分:-1)

据我所知,这里没有必要使用预见。 试试这个

sed -n '/finalNumber="[[:digit:]]\+"/p'