Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

How to make sed only print the matched expression?

I want to rewrite strings like "Battery 0: Charging, 44%, charging" to "Battery: 44%". I tried the following:

sed -n '/\([0-9]*%\)/c Battery: \1'

This doesn't work.

The common "solution" out there is to use search and replace and match the whole line: sed -n 's/.*\([0-9]*%\).*/Battery: \1/p' Now the .* are too greedy and the \1 is only the %.

Furthermore I don't want to match more than I need to.

share|improve this question
up vote 5 down vote accepted
  • Make the regexp a little more specific.

    sed -n 's/.* \([0-9]*%\),.*/Battery: \1/p'
  • Pick a different tool.

    perl -ne '/(\d+%)/ && print "Battery: $1\n";'

    (just for the record, foo && bar is shorthand for if (foo) { bar }.)

share|improve this answer
Ah. The space in the first regexp makes it work like charm. Sadly you still have to match the whole string. I probably going to try awk. – user75250 Apr 6 '11 at 16:25
It looks to me that even awk isn't able to do it. So i have to use full blown perl to match a string and reformat it? – user75250 Apr 7 '11 at 10:45
@user: Are you implying there's something wrong with Perl? :) – grawity Apr 7 '11 at 13:16
This script is used to update the status bar in wmii, so around every second i guess. I dont know whether perl eats to much resources if used just for this purpose of rewritting a string. Guess I have to write my own tool. – user75250 Apr 12 '11 at 10:40
@user: In that case, try bash's [[ $val =~ regex ]], along with $BASH_REMATCH. Also, since it's battery status, consider increasing the interval to 5 or 7 seconds. (By the way, can Linux cache the Perl binary in memory after first exec?) – grawity Apr 12 '11 at 11:58

Perhaps you could grep -o (the -o is important) for the required values instead and use those in your script(?) That way you could use the value in more creative ways or perhaps just wrapped in echo's etc.

share|improve this answer
I would prefer to do it with sed (or being told it isn't possible and use awk) in case i want to extend it to do more complicated things with the string. – user75250 Apr 6 '11 at 15:28

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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