Sed 修剪流的最后一个字符

Sed 修剪流的最后一个字符,sed,command-line,stream,truncate,Sed,Command Line,Stream,Truncate,我使用sed-e'$s/$/'修剪流的最后一个字符。这样做正确吗?使用其他命令行工具是否还有其他更好的方法 $ builtin printf 'a\nb\0' | 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/.$//

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

$ builtin printf 'a\nb\0' | 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\0'| head-c-1 | od-c-t x1-Ax
000000a\n b
61 0a 62
000003
printf'a\nb\n'| head-c-1 | od-c-t x1-Ax
000000a\n b
61 0a 62
000003

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

Perl可以将整个流过滤成一个字符串,并可以删除最后一个字符:

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

折衷是需要将整个流保存在内存中。

输入流中不应假定没有字符。确定使用
head检查我的更新答案。
首选来去解决方案。在内存中保存所有内容是有问题的,尤其是当输入很大时。