wc -L 报告制表符的行长度为 8。错误还是功能?

wc -L 报告制表符的行长度为 8。错误还是功能?

-L是一个有用的功能wc,至少我是这么认为的。它打印最长行的长度。由于某种原因,它将单字节制表符扩展为长度 8。
是否有某种方法可以将其设置为不“扩展”制表符?这种扩张背后的理由可能是什么?

echo -n $'\t' | wc -L

输出 8

wc (GNU coreutils) 7.4
GNU bash,版本 4.1.5

答案1

我发现没有与此相关的错误报告,并且以下几行源文件wc.c

    case '\t':
        linepos += 8 - (linepos % 8);

似乎故意选择这种方式,可能是为了提示在屏幕上显示文件所需的宽度。

一个快速的替代方案可能是

echo -n $'\t' | tr '\t' ' ' | wc -L

答案2

wc -L 描述不明确。它返回最宽的显示宽度。要控制选项卡扩展,您可以首先进行过滤expand

答案3

通常,选项卡会扩展到下一个位置(可被 8 整除)+1 [1, 9, 17, 25, ...],因此如果您要求它,您就会得到它。

请注意,-n 与问题无关,但 $ 则不然。

echo foo$'\t' | wc -L

也会返回 8,因为

echo foo$'\t'bar 
foo     bar

如果使用 -e 进行 echo,则可以省略 $:

echo -e '\t' | wc -L
8

因此,如果您想将 '\t' 算作单个字节,只需省略 -e 和 $:

echo '\t' | wc -L
2

相关内容