修剪流的最后一个字符

时间:2021-04-01 16:12:59

标签: 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/.$//' | od -c -t x1 -Ax
000000   a  \n  \n
        61  0a  0a
000003

2 个答案:

答案 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

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

相关问题