I have a specs file:
Name: program Version: 2.3.3 Release: 0 ...
I want to update the version number every time it’s built. I perform the build from a bash script so I’m calling
sed to update the SPECS file and a “version” file which holds the version number.
I am using the following sed script to perform the update:
sed -ri 's/^(Version:s+)([0-9.]+)/1$version/g' SPECS/*.spec
$version being provided by the bash script.
It’s designed to look for the correct line and replace the version portion while preserving whatever whitespace has been used. I use
*.spec so that it will work with a spec file of any name.
I felt that a sed one-liner made the most sense given the requirement.
Variables don’t interpolate inside single quotes. You need double quotes.
No need to capture the old version that we’re throwing away. The
/g is redundant since the pattern can never match more than once per line (being anchored to start-of-line).
What happens with
Version:? Better to take the whole line, possibly excluding comments, and relax the space requirement.
sed -ri "s/^(Version:s*)[^#]*/1$version/" SPECS/*.spec
It’s possible for the description or another section to contain the trigger text, and we probably don’t want to change that. Use sed’s
start,stop addressing to limit replacement to the top block only, stopping at the first
sed -ri "1,/^s*%/s/^(Version:s*)[^#]*/1$version/" SPECS/*.spec