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!!!

1
  • You might consider moving this to stackoverflow, I'm sure we'll be able to help but they might be quicker. Commented Sep 22, 2010 at 16:31

2 Answers 2

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 
2
  • 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. Commented Sep 22, 2010 at 17:20
  • On OS X, use -E instead of -r. Commented Jan 10, 2011 at 14:05
1

Also, works:

cat blah | cut -f2 -d\" 

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.