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
权衡是您需要将整个流保存在内存中。
我使用 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
权衡是您需要将整个流保存在内存中。