How to use sed to replace regex capture group?

sed uses POSIX BRE, and BRE doesn't support one or more quantifier +. The quantifier + is only supported in POSIX ERE. However, POSIX sed uses BRE and has no option to switch to ERE.

Use ..* to simulate .+ if you want to maintain portability.

Or if you can assume that the code is always run on GNU sed, you can use GNU extension \+. Alternatively, you can also use the GNU extension -r flag to switch to POSIX ERE. The -E flag in higuaro's answer has been tagged for inclusion in POSIX.1 Issue 8, and exists in POSIX.1-202x Draft 1 (June 2020).


In your regex change + with *:

sed -E "s/(.*)\.png/\/full\/path\/\1/g" <<< "lolsed_bulsh.png"

It prints:

/full/path/lolsed_bulsh

NOTE: The non standard -E option is to avoid escaping ( and )


Save yourself some escaping by choosing a different separator (and -E option), for example:

cat myfile.txt | sed -E "s|(..*)\.png|/full/path/\1|g" | ack /full/path

Note that where supported, the -E option ensures ( and ) don't need escaping.

Tags:

Regex

Bash

Sed