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>