我使用 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
答案 0 :(得分:0)
您可以使用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
答案 1 :(得分:0)
似乎您不能依赖任何自动删除和重新添加换行符的面向行的工具(如 sed)。
Perl 可以将整个流变成一个字符串并可以删除最后一个字符:
$ printf 'a\nb\0' | 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
权衡是您需要将整个流保存在内存中。