Search code examples
sedcommand-linestreamtruncate

Trim the last character of a stream


I use sed -e '$s/.$//' to trim the last character of a stream. Is it the correct way to do so? Are there other better ways to do so with other command line tools?

$ builtin printf 'a\nb\0' | sed -e '$s/.$//' | od -c -t x1 -Ax
000000   a  \n   b
        61  0a  62
000003

EDIT: It seems that this command is not robust. The expected output is a\nb for the following example. Better methods (but not too verbose) are needed.

$ builtin printf 'a\nb\n' | sed -e '$s/.$//' | od -c -t x1 -Ax
000000   a  \n  \n
        61  0a  0a
000003

Solution

  • You may use head -c -1:

    printf 'a\nb\0' | head -c -1 | od -c -t x1 -Ax
    
    000000   a  \n   b
            61  0a  62
    000003
    
    
    printf 'a\nb\n' | head -c -1 | od -c -t x1 -Ax
    
    000000   a  \n   b
            61  0a  62
    000003