Reputation: 5213
I have a large file with many scattered file paths that look like
lolsed_bulsh.png
I want to prepend these file names with an extended path like:
/full/path/lolsed_bullsh.png
I'm having a hard time matching and capturing these. currently i'm trying variations of:
cat myfile.txt| sed s/\(.+\)\.png/\/full\/path\/\1/g | ack /full/path
I think sed has some regex or capture group behavior I'm not understanding
Upvotes: 70
Views: 135204
Reputation: 533
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.
Upvotes: 35
Reputation: 56809
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).
Upvotes: 14
Reputation: 16039
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 )
Upvotes: 84