带计数行号的额外空间?

Sib*_*ing 4 shell string wc

我在 OSX 上使用此命令计算文件的行数:

nl=$(wc -l < ~/myfile.txt)
Run Code Online (Sandbox Code Playgroud)

说,nl结果是 100。现在,我想nl在另一个命令中使用结果,但奇怪的是,

echo 1-$nl
Run Code Online (Sandbox Code Playgroud)

给我1- 100而不是1-100.

演示

cv me$ nl=$(wc -l < ~/Desktop/cap.xlsx)
cv me$ echo $nl
104
cv me$ echo 1-$nl
1- 104
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

在此处输入图片说明

为什么会发生这种情况?我怎样才能得到1-100

Jan*_*nis 5

wc实现可能会产生前导空格;这也可能取决于是否使用(以及使用了多少)选项(wc例如,如果在您的情况下只使用了一个选项,则GNU不会产生空格)。这些空格保留在分配中nl=$(...)。要删除空格,作为一种解决方法,您可以使用以下任一方法:

nl=$(wc -l < ~/myfile.txt | awk '{print $1}')
Run Code Online (Sandbox Code Playgroud)

或者

nl=$(awk 'END{print NR}' ~/myfile.txt)
Run Code Online (Sandbox Code Playgroud)

或者

nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=$(echo $nl)
Run Code Online (Sandbox Code Playgroud)

或(但请参阅下面@cuonglm 的评论,了解 的传家宝版本wc

nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=${nl##* }
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 5

正如 POSIX 定义的那样, 的输出wc应包含以下形式的每个输入文件的条目:

"%d %d %d %s\n", <newlines>, <words>, <bytes>, <file>
Run Code Online (Sandbox Code Playgroud)

但输出文件格式伪printf()字符串与 System V 版本不同wc

"%7d%7d%7d %s\n"
Run Code Online (Sandbox Code Playgroud)

POSIX 不需要添加前导空格,因此可以免费实现它想要做的事情。有不同的实现wc,至少在 OSX 和wc传家宝工具箱中,它为输出添加了前导空格。

$ /usr/5bin/wc -l /tmp/file
      3  /tmp/file
Run Code Online (Sandbox Code Playgroud)

GNU wc 在从标准输入和不使用任何选项读取时也会添加前导空格:

$ cat file | wc
  5       5      65
Run Code Online (Sandbox Code Playgroud)

要删除所有前导空格,请在 POSIX shell 中:

set -f
set -- $nl
nl=$1
set +f
Run Code Online (Sandbox Code Playgroud)

请注意,这种方法假设变量只包含前导或尾随空格,中间没有空格,如ab