Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Mar 2021 22:39:39 -0600
From:      Kyle Evans <kevans@freebsd.org>
To:        freebsd@dreamchaser.org
Cc:        FreeBSD Mailing List <freebsd-questions@freebsd.org>
Subject:   Re: sed -i empty argument compatibility issue
Message-ID:  <CACNAnaGNj55KkSEZOoEqtMVOXtFpk5Ek9tEKJJYARWUGgpwCcw@mail.gmail.com>
In-Reply-To: <9178f6c5-631a-c2c2-c6b1-8def94a3397b@dreamchaser.org>
References:  <9178f6c5-631a-c2c2-c6b1-8def94a3397b@dreamchaser.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Mar 5, 2021 at 3:03 PM Gary Aitken <freebsd@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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CACNAnaGNj55KkSEZOoEqtMVOXtFpk5Ek9tEKJJYARWUGgpwCcw>