使用wc -l命令时出现意外的前导空格

7

我试图执行下面的命令,但输出结果前面有一些空格。

ls -lrt | wc -l
     29
echo $SHELL
/bin/bash

当我在另一台机器上运行相同的命令时,输出结果如预期。
ls -lrt | wc -l
183
echo $SHELL
/bin/bash

前面的空格导致我的perl验证失败

unless ( $phCountRet->{COUNT} =~ /^\d+$/ ){
...
}

我可以选择去除前导空格然后进行验证,但这不是一个完美的解决方案。

如果您能指出可能导致此问题的原因,那将是非常有帮助的。


这些机器中有一台运行AIX吗?相关链接:https://dev59.com/Mmkv5IYBdhLWcg3w8FWY - reinierpost
你为什么认为去除空格不干净?ls | wc -l | sed -e 's/^ *//'看起来并不比ls -lrt | wc -l更不干净,但你可以直接执行相当于perl -E 'say length glob "*"'的命令,而不需要使用wc。 - William Pursell
1
当您使用多个文件名运行wc时,它会对数字进行对齐和右对齐,以使其更易读(至少某些实现是如此)。输出旨在更适合人类阅读而非机器阅读。您只需允许输出中的空白变化即可。 - Keith Thompson
2个回答

2

使用

unless ( $phCountRet->{COUNT} =~ /^\s*\d+$/ ){

这也匹配前面有空格的数字。


谢谢Jens。是的,我肯定可以修改正则表达式以适应这种情况。但是,我更想知道为什么会引入前导空格。 - Soumya
@Soumya 考虑更好的可读性。但也要考虑这个问题是否不适合讨论主题。 - Jens
这个回答仅仅重申了操作者的建议,没有回答操作者提出的问题。 - Thomas Dickey

2

正如我在WC on OSX - Return includes spaces中所指出的那样,这是一个实现细节,在POSIX标准中并没有明确说明(因此它取决于实现者对齐列的偏好与否)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接