Cristian Ionescu-Idbohrn wrote:
sed (GNU sed) 4.2.2 can do this:

        $ printf 'foo
        bar
        baz' | sed r -
        foo
        bar
        baz

or, after storing the text in a file:

        $ printf 'foo
        bar
        baz' >/tmp/bar

        $ sed r /tmp/bar
        foo
        bar
        baz

But busybox sed can't:

        $ printf 'foo
        bar
        baz' | busybox sed r -
        sed: empty filename

        $ busybox sed r /tmp/bar
        sed: empty filename

        $ printf '' | busybox sed 'r /tmp/bar'
        <no output, although /tmp/bar size is 11 bytes>

        $ busybox sed 'r /tmp/bar'
        <waiting for stdin; ^D; no output>

The 'r' command is documented by GNU sed as a GNU extension.  Still,
busybox sed documents the 'r' command as supported:

    r [address]r file
           Read contents of file and append after the contents of the
           pattern space. Exactly one space must be put between r and the
           filename.

Am I misinterpreting the documentation?
From the documentation:
>   The full format for invoking `sed' is:
>     sed OPTIONS... [SCRIPT] [INPUTFILE...]
So in your example you invoce sed with the script "r" and the input file "-" or "/tmp/bar". The content is not printed because it is the argument to the "r" command, but because it is the main input file to sed. You can avoid that by using quotes around the command and the file name, or by omitting the space between the command and the filename. You should also try the last two examples, where you invoke busybox sed with quotes, with GNU sed. The behaviour is the same.

You should note that in your example when reading from a file, sed didn't read from stdin, at least you don't mention it, although your interpretation would mean that the filename is the argument to the "r" command, therefor no argument is given to sed, and sed should read stdin.

You should also not that invoking the "r" command with the filename causes the content of this file to be inserted after every line. When reading from a pipe, the pipe is empty after the first line.

My documentation to GNU sed 4.2.2 says:
> `r FILENAME'
>      As a GNU extension, this command accepts two addresses.
>
>      Queue the contents of FILENAME to be read and inserted into the
>      output stream at the end of the current cycle, or when the next
>      input line is read.  Note that if FILENAME cannot be read, it is
>      treated as if it were an empty file, without any error indication.
>
>      As a GNU `sed' extension, the special value `/dev/stdin' is
>      supported for the file name, which reads the contents of the
>      standard input.

So the main difference seems to be that GNU sed doesn't give an error message if the file can't be read. I'm not sure why that would be a good idea. Also not that there is no mention of using "r -" for stdin, instead /dev/stdin is mentioned.

On the other hand, I don't know why busybox sed needs exactly one space between command and filename. GNU sed works with zero or more spaces.
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to