Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Mar 2021 20:50:46 -0700
From:      Gary Aitken <freebsd@dreamchaser.org>
To:        freebsd-questions@freebsd.org
Subject:   Re: sed -i empty argument compatibility issue
Message-ID:  <606b8bfa-4fe5-883a-d7ac-99f41655f728@dreamchaser.org>
In-Reply-To: <20210305142352297368817@bob.proulx.com>
References:  <9178f6c5-631a-c2c2-c6b1-8def94a3397b@dreamchaser.org> <20210305142352297368817@bob.proulx.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 3/5/21 2:43 PM, Bob Proulx wrote:
> Gary Aitken 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.)
...> In order to port this then _something_ must be changed.  As to what 
> must be changed that is up to you and judegement and the larger view 
> of everything in your environment.  But off the top of my head these 
> different possibilities come to mind.
> 
> 1. Edit the script and change this to that.  This makes it run on 
> FreeBSD sed.  Of course then this does not work the other direction.
> 
> -COMMAND sed -i "/^# /d" "${outfile}" +COMMAND sed -i "" "/^# /d"
> "${outfile}"
> 
> 2. Use perl.  Change that edit command to be this.  This should work 
> the same everywhere that has perl.  It does create a dependency upon 
> perl that might not have been present before.
> 
> perl -i -lpe 'next if /^# /' "${outfile}"
> 
> 3. Avoid -i and use a temporary file, just like in the old days. 
> However this introduces the need for temporary file handling.  But 
> maybe that isn't important here.
> 
> sed "/^# /d" "${outfile}" > "$tmpfile" && mv "$tmpfile" "${outfile}"
> 
> 4. Introduce a "sed" wrapper in PATH that intercepts the call to the 
> real sed, detects this problematic usage case, and then DTRT does
> the right thing with it.  This wrapper could have all of the correct 
> temporary file handling needed to make this work.  More involved to
> do this but if I were faced with a large unknown code base and
> expected to see a lot of this then I would consider it a good global
> workaround for portability.
> 
> 5. Hack a local FreeBSD sed version to detect this case and DTRT
> with the option.
> 
> 6. Compile GNU sed locally and install it in PATH earlier.  This
> would probably be a generally good option globally.  However it's
> possible you might run into portability problems in the reverse
> case.

Thanks for the list.  That's two more than I came up with.  I'm
inclined to #2 (which I hadn't thought of) or #3.

> Good luck!  I'll be interested in hearing how things work out for
> you.

Thanks.  I'm asking the authors for feedback.

Gary



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?606b8bfa-4fe5-883a-d7ac-99f41655f728>