sed -i empty argument compatibility issue
Kyle Evans
kevans at freebsd.org
Sat Mar 6 04:39:51 UTC 2021
On Fri, Mar 5, 2021 at 3:03 PM Gary Aitken <freebsd at dreamchaser.org> wrote:
>
> I'm trying to come up with a fix for a script in a port which invokes sed.
> The port comes from a linux environment, and the offending line looks like this:
> (This is in a cMake file.)
>
> COMMAND sed -i "/^# /d" "${outfile}"
>
> The issue is that linux sed expects the -I or -i extension modifier to
> immediately follow the -i. In the above line, the extension is deliberately
> missing to provide in-place editing.
>
> fbsd expects the extension to be separated from the -i by whitespace, or
> doesn't work properly when it is empty or immediately follows the -i:
>
> $ !ls
> ls -lt temp.tmp*
> -rw------- 1 garya garya 86 Mar 5 13:15 temp.tmp
> -rw------- 1 garya garya 86 Mar 5 13:15 temp.tmp_org
> $ sed -ifoo "/^# /d" temp.tmp (works on both fbsd & linux))
> $ !ls
> ls -lt temp.tmp*
> -rw------- 1 garya garya 30 Mar 5 13:48 temp.tmp
> -rw------- 1 garya garya 86 Mar 5 13:15 temp.tmp_org
> -rw------- 1 garya garya 86 Mar 5 13:15 temp.tmpfoo
> $ cp -p temp.tmp_org temp.tmp
> $ sed -i"" "/^# /d" temp.tmp (works on linux but not fbsd)
> sed: 1: "temp.tmp": undefined label 'emp.tmp'
> $ sed -i "" "/^# /d" temp.tmp (works on fbsd but not linux)
> $ !ls
> ls -lt temp.tmp*
> -rw------- 1 garya garya 30 Mar 5 13:49 temp.tmp
> -rw------- 1 garya garya 86 Mar 5 13:15 temp.tmp_org
> -rw------- 1 garya garya 86 Mar 5 13:15 temp.tmpfoo
>
> So fbsd works with '-i ""' but linux requires '-i""'
>
> Does anyone know a work-around for this problem?
>
My personal favorite trick to bridge the gap here was, as I recall:
sed -i'' '' 's/../.../' ${file}
IIRC those sed's with an optional backup suffix (Linux, OpenBSD) will
accept the immediately following empty string and accept the next
empty word as an empty command, while our getopt will effectively
ignore the rest of the -i word and use the following optarg as usual.
More information about the freebsd-questions
mailing list