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


12

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

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

输出 8

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


-n与问题正交。
用户未知,

Answers:


11

我找不到与此相关的错误报告,并且在源文件中没有以下几行 wc.c

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

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

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

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

2
谢谢恩佐,我现在发现,尽管man wc没有提及此问题,但在info coreutils 'wc invocation'(“ man”也指代)中作了说明。此外,在对google-sphere进行了更多的拖曳之后,我发现这可以作为替代方案echo -n $'\t' | expand -t1 | wc -L,它与您的替代品几乎相同,但是我已经将其投入了很好的测量。尽管以下链接是重新编译的wc hack *,但它可能对某些人很有用:wc支持不同的制表符宽度
Peter.O 2011年

1

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

请注意,-n与该问题无关,但$无关。

echo foo$'\t' | wc -L

也将返回8,因为

echo foo$'\t'bar 
foo     bar

如果将-e用于回显,则可以省略$:

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

因此,如果要将“ \ t”计为一个字节,只需省略-e和$:

echo '\t' | wc -L
2

是的,对于打印/显示的输出来说,扩展制表符已经足够普遍了,但是我发现奇怪的是,一个计算字节和单词数的程序会将1个字符算作除1个字符之外的任何其他字符……btw echo '\t'不会输出制表符(\ x09)。它输出一条长度为2的线,即。a '\'和a 't'。换行符不是行长度的一部分...(-n在我的示例中,我检查了是否wc可以正确处理没有尾随换行符的文件...)
Peter.O 2011年

wc --help说:-L, --max-line-length print the length of the longest line?。它不是在谈论字节,而是在谈论行长。
用户未知

1
是的,它确实说“打印最长行的长度” ...`,但没有说 “我们假设您要扩展制表符(不像大多数其他长度功能一样,不是通常的字符数)。。这样,无论您将特定的制表位设置为什么,我们都会将制表符扩展到8个空格。” ...这就是陷阱。.没有正确记录。
Peter.O 2011年

如何设置标签?在Bash中?此外:标签没有扩展到8位,但于位置,看echo -e foo'\t'bar | wc -L在11结果,而不是在14
用户未知

另外,在上述foo\tbar例子中,wc假定在的标称间距制表停止8 ...以下示例示出了如何wc将忽略当前激活的制表位设置。它向终端输出一条线,该线宽/长为8个终端列,但wc报告为11。此示例将制表位设置为每第6列...tabs -6; echo 12345678; echo -e "foo\tbar"|tee >(wc -L)
Peter.O 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.