Trim 流的最后一个字符

Trim the last character of a stream

我使用 sed -e '$s/.$//' 到 trim 流的最后一个字符。这是正确的方法吗?使用其他命令行工具还有其他更好的方法吗?

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

编辑:这个命令似乎不可靠。对于以下示例,预期输出为 a\nb。需要更好的方法(但不要太冗长)。

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

您可以使用 head -c -1:

printf 'a\nb[=10=]' | 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

您似乎不能依赖任何自动删除和重新添加换行符的面向行的工具(如 sed)。

Perl 可以将整个流压缩成一个字符串并可以删除最后一个字符:

$ printf 'a\nb[=10=]' | perl -0777 -pe chop  | od -c -t x1 -Ax
000000   a  \n   b
        61  0a  62
000003

$ printf 'a\nb\n' | perl -0777 -pe chop  | od -c -t x1 -Ax
000000   a  \n   b
        61  0a  62
000003

权衡是您需要将整个流保存在内存中。