Sometimes I need to edit a file in batch mode. Say you have /etc/default/foo
and you want to change BAR="-c5"
to BAR="-c4"
. One of the popular methods is using sed in-place edit, like this:
sed -i -e 's/BAR="-c5"/BAR="-c4"/' foo
If your version of sed is antiquated and doesn’t support in-place editing you can do the same using perl:
perl -i -p -e 's/BAR="-c5"/BAR="-c4"/' foo
The problem with this approach is that if the needle doesn’t exist, sed and perl will silently skip doing the replacement. For example if upstream changes BAR="-c5"
to BAR="-c3"
then your sed/perl will happily and silently leave it at -c3 instead of changing to -c4 and most probably you will not notice until much later.
One can use patch instead, but it is somewhat clumsy to save a diff file with at least 5 lines in it, just to change one character in the input file…
There’s always the possibility to add some more perl code and make it:
perl -i -pe 's/BAR="-c5"/BAR="-c4"/ and $e|=1; END{exit(!$e)}' foo
I feel this is hackish and somewhat error prone though.
What’s your solution?