how to use sed, awk, or gawk to print only what is matched?

My sed (Mac OS X) didn't work with +. I tried * instead and I added p tag for printing match:

sed -n 's/^.*abc\([0-9]*\)xyz.*$/\1/p' example.txt

For matching at least one numeric character without +, I would use:

sed -n 's/^.*abc\([0-9][0-9]*\)xyz.*$/\1/p' example.txt

You can use sed to do this

 sed -rn 's/.*abc([0-9]+)xyz.*/\1/gp'
  • -n don't print the resulting line
  • -r this makes it so you don't have the escape the capture group parens().
  • \1 the capture group match
  • /g global match
  • /p print the result

I wrote a tool for myself that makes this easier

rip 'abc(\d+)xyz' '$1'

I use perl to make this easier for myself. e.g.

perl -ne 'print $1 if /.*abc([0-9]+)xyz.*/'

This runs Perl, the -n option instructs Perl to read in one line at a time from STDIN and execute the code. The -e option specifies the instruction to run.

The instruction runs a regexp on the line read, and if it matches prints out the contents of the first set of bracks ($1).

You can do this will multiple file names on the end also. e.g.

perl -ne 'print $1 if /.*abc([0-9]+)xyz.*/' example1.txt example2.txt