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.


  • 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

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
  • thanks! I couldn't get it to work on mac, but it's great on linux. I'm piping from other input, hence the cat. I did have to just use sed -r though. – carillonator Sep 22 '10 at 17:20
  • On OS X, use -E instead of -r. – Dennis Williamson Jan 10 '11 at 14:05

Also, works:

cat blah | cut -f2 -d\"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.