sed / awk:从string中提取一个数字

我有许多行,像下面这样从bash命令返回,具有不同的数字长度的sourceNodeIds

 <NodeAssociation sourceNodeId="33654" [...] sourceNodeEntity="Issue" /> 

我想sourceNodeId="nnnn"sedawk,只需从sourceNodeId="nnnn"返回数字nnnn

就像是:

 cat blah | sed 's/.+?sourceNodeId="\(\d+\)".+/\1/' 

但是这不起作用。 我在Mac上,如果这有什么区别(我认为sed的版本可能会有所不同)。 我知道Perl的正则expression式,但我认为sed期待着一种不同的types。

谢谢!!!

sed不知道\d和非贪婪的匹配。 你不需要使用cat 。 这应该工作:

 sed 's/.*sourceNodeId="\([0-9]\+\)".*/\1/' file 

一些sed版本对于想要一个-e (即使不需要它也可以工作)是挑剔的:

 sed -e 's/.*sourceNodeId="\([0-9]\+\)".*/\1/' file 

如果你的sed支持-r你可以跳过这个转义:

 sed -er 's/.*sourceNodeId="([0-9]+)".*/\1/' file 

另外,作品:

 cat blah | cut -f2 -d\"