0

I have many lines like the following being returned from a bash command, with different sourceNodeIds of varying digit lengths:

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

I'd like to pipe it to sed or awk and just return the number nnnn from sourceNodeId="nnnn"

something like:

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

but this isn't working. I'm on a Mac if that makes any difference (I think the version of sed may be different). I know Perl regexes, but I think sed is expecting a different kind.

Thanks!!!

carillonator
  • 815
  • 3
  • 12
  • 22
  • You might consider moving this to stackoverflow, I'm sure we'll be able to help but they might be quicker. – Chopper3 Sep 22 '10 at 16:31

2 Answers2

3

sed doesn't know about \d and non-greedy matches. You don't need to use cat. This should work:

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

Some sed versions are picky about wanting a -e (it will work even if it's not required):

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

If your sed supports -r you can skip the escaping:

sed -er 's/.*sourceNodeId="([0-9]+)".*/\1/' file
Dennis Williamson
  • 62,149
  • 16
  • 116
  • 151
1

Also, works:

cat blah | cut -f2 -d\"
Lucas Kauffman
  • 16,880
  • 9
  • 58
  • 93
fatherlinux
  • 146
  • 1
  • 6