sed -i empty argument compatibility issue

parv/freebsd parv.0zero9+freebsd at gmail.com
Sat Mar 6 04:33:56 UTC 2021


On Fri, Mar 5, 2021 at 5:56 PM Gary Aitken wrote:

> 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:

...

> 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}"
>

I like it!


> > 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}"
>

This won't do, when ...

> 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.
>
...

#!/bin/sh

# Set sed path & -i option based on "uname -a" output.
SED=
host_type=$( uname -a )
case "${host_type}" in
  *Linux* )
    SED="/usr/bin/sed -i''"
  ;;
  *FreeBSD* )
    SED="/usr/bin/sed -i ''"
  ;;
esac

# Set $@ to contain original arguments prefixed by sed with -i option.
set -- ${SED} $@
# Now run the sed with the arguments given.
$@


> 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.
>

If GNU sed could be installed, this would be most agreeable.

I prefer to use the absolute path to remove ambiguity about the kind of
sed being used, especially in the above case.

- parv


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.
>
--


More information about the freebsd-questions mailing list