From owner-freebsd-questions@freebsd.org Sat Mar 6 05:43:05 2021 Return-Path: Delivered-To: freebsd-questions@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 04383576C24 for ; Sat, 6 Mar 2021 05:43:05 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "smtp.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Dstmm5x27z4pJv for ; Sat, 6 Mar 2021 05:43:04 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: from mail-qt1-f171.google.com (mail-qt1-f171.google.com [209.85.160.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "GTS CA 1O1" (verified OK)) (Authenticated sender: kevans) by smtp.freebsd.org (Postfix) with ESMTPSA id BA19D200FF for ; Sat, 6 Mar 2021 05:43:04 +0000 (UTC) (envelope-from kevans@freebsd.org) Received: by mail-qt1-f171.google.com with SMTP id l14so807327qtr.10 for ; Fri, 05 Mar 2021 21:43:04 -0800 (PST) X-Gm-Message-State: AOAM533MpV++V52paT9WVBpeJAcbNbSvDzHAqkq3w2kSDsaE91JYDaZY 0AFeJ5zJZRXkdaw3GSY2YAyiUHNuI+ku5TbnMVE= X-Google-Smtp-Source: ABdhPJz3T2IGhX4LFk13rooIk0wbOUR7Z8+CRkXejJM19KwGDg4leEQM4DgqWWCT19QzFstdAiuBv2aCpwLdFinaPXI= X-Received: by 2002:ac8:5947:: with SMTP id 7mr12286170qtz.60.1615009384047; Fri, 05 Mar 2021 21:43:04 -0800 (PST) MIME-Version: 1.0 References: <9178f6c5-631a-c2c2-c6b1-8def94a3397b@dreamchaser.org> <42cacf1d-88be-d8a2-9ff4-f82ce378adc7@dreamchaser.org> In-Reply-To: <42cacf1d-88be-d8a2-9ff4-f82ce378adc7@dreamchaser.org> From: Kyle Evans Date: Fri, 5 Mar 2021 23:42:52 -0600 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: sed -i empty argument compatibility issue To: freebsd@dreamchaser.org Cc: FreeBSD Mailing List Content-Type: text/plain; charset="UTF-8" X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 06 Mar 2021 05:43:05 -0000 Ie On Fri, Mar 5, 2021 at 11:30 PM Gary Aitken wrote: > > On 3/5/21 10:15 PM, Kyle Evans wrote: > > On Fri, Mar 5, 2021 at 11:12 PM Gary Aitken wrote: > >> > >> On 3/5/21 9:39 PM, Kyle Evans wrote: > >>> On Fri, Mar 5, 2021 at 3:03 PM 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.) > >>>> > >>>> 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. > >> > >> Unfortunately, times appear to have changed, at least on ubuntu-18.04: > >> > >> $ sed -i'' '' "/^# /d" temp.tmp > >> sed: can't read /^# /d: No such file or directory > >> > > > > Oh, sorry. Try slapping with an -e: > > > > $ sed -i'' '' -e "/^# /d" temp.tmp > > nope: > > $ sed -i'' '' -e "/^# /d" temp.tmp > sed: can't read : No such file or directory > $ !ls > ls -lt temp.tmp* > -rw-rw-r-- 1 garya garya 86 Mar 6 05:29 temp.tmp > -rw-rw-r-- 1 garya garya 86 Mar 5 20:45 temp.tmp_org > > Gary Bah, ok, sorry for the noise- I thought I remembered there being some odd invocation that can be done to make it work out, but I clearly don't recall what that is now and trying to search my inbox for 'sed' is a total disaster. Is this used only at build-time, or at runtime? The former can just pull in gsed as a BUILD_DEPENDS and use a BINARY_ALIAS to stash it first. Autoconfig takes some more work; ac_cv_path_SED=${LOCALBASE}/bin/gsed instead, maybe. At runtime, your best option is to patch the script to use gsed and slap a RUN_DEPENDS on that bad boy. I've wanted to make our -i arg optional for a long time to match OpenBSD/Linux, but that's a POLA violation too far even for me to pursue. Thanks, Kyle Evans