mike
mike

Reputation: 1720

Do not print unmatched text with sed

I want to print only matched lines and strip unmatched ones, but with following:

$ echo test12 test  | sed -n 's/^.*12/**/p'

I always get:

** test

instead of:

**

What am I doing wrong?

[edit1]

I provide more information of what I need - and actually I should start with it. So, I have a command which produced lots of lines of output, I want to grab only parts of the lines - the ones that matches, and strip the result. So in the above example 12 was meant to find end of matched part of the line, and instead of ** I should have put & which represents matched string. So the full example is:

echo test12 test  | sed -n 's/^.*12/&/p'

which produces exactly the same output as input:

test12 test

the expected output is:

test12

As suggested I started to find a grep alternative and the following looks promising:

$ echo test12 test  | grep -Eo "^.*12"

but I dont see how to format the matched part, this only strips unmatched text.

Upvotes: 2

Views: 3470

Answers (3)

Philip Stark
Philip Stark

Reputation: 638

EDIT: In some cases, the -E flag might be needed for sed. But then the brackets don't need to be escaped anymore. check your sed's man page.

I think what you are looking for is this:

echo test12 test  | sed -n 's/^\(.*12\).*$/\1/p'

if you want to discard the rest of the line, you have to match it as well, but not include it in the output. the \( and \) denote a group that is then referenced by the \1.

Good luck :)

Additional information on sed: sed works on lines, and the ampersand characters represents the entire line that was matched by the given regular expression. if a regex is "open" at the end (i.e. doesn't end with the endline character ($), it acts as if .*$ is appended to the match string. (not sure if that is how it is implemented, but could very well be.)

Upvotes: 5

AAA
AAA

Reputation: 111

Your regular expression is matching anything from the beginning of the line until the expression '12'. All the matched expression is replaced with '**', that is why you get '** test'. If you want only match I recommend you using grep.

Upvotes: 1

Dan Kreiger
Dan Kreiger

Reputation: 5516

Try:

echo test12 test  | sed -n 's/^.*/**/p'

You don't need to match the number 12, since that is already being done in your regex.

Upvotes: 1

Related Questions