On Mon, Jun 23, 2025 at 11:36:19PM +0200, Bruno Haible via Patches for autoconf 
- the GNU build system wrote:
> With GNU sed:
> 
> $ echo foo | sed -e 's/f.*/line1\nline2/'
> line1
> line2
> 
> Even in strict POSIX mode:
> 
> $ echo foo | POSIXLY_CORRECT=1 sed --posix -e 's/f.*/line1\nline2/'
> line1
> line2
> 
> Whereas with OpenBSD sed and Solaris 11.4 sed:
> 
> $ echo foo | sed -e 's/f.*/line1\nline2/'
> line1nline2
> 
> Here's a proposed patch to update the Autoconf documentation.
> 
> Note: I think POSIX [1] mandates the behaviour of OpenBSD and Solaris sed.
> But that is not immediately relevant for the Autoconf manual: The portability
> problem exists regardless of how we might interpret POSIX.

The GNU behaviour is likely non-conforming with Issue 5 (1997) and
earlier specifications, but since Issue 6 (2001) the meaning of \n in
the replacement string is explicitly unspecified.  So both behaviours
are POSIX-compliant nowadays.

> +In the replacement text of an @samp{s}, it is not portable to use
> +escape sequences like @samp{\n}.  While GNU @command{sed} interprets
> +them, the @command{sed} commands of OpenBSD and Solaris don't.

It would probably be helpful to mention that the POSIX-standard and
portable method to substitute a newline with sed is to use backslash-
newline.  For example:

% echo foo | sed 's/f.*/line1\
line2/'
line1
line2

Cheers,
  Nick

  • Document anot... Bruno Haible via Patches for autoconf - the GNU build system
    • Re: Docu... Nick Bowler
      • Re: ... Bruno Haible via Patches for autoconf - the GNU build system
        • ... Paul Eggert

Reply via email to