【问题标题】:Why does the wc command count one more character than expected?为什么 wc 命令比预期的多一个字符?
【发布时间】:2015-07-23 10:13:22
【问题描述】:

以下是我的文件中存储的内容

This is my Input

所以,使用wc -c 命令我们可以得到文件中存储的字符数。

我在 Ubuntu 中使用 Vim 编辑的上述文件的预期输出是 16。但是,wc -c 命令返回 17

为什么是这样的输出?行尾甚至没有回车。那么,第 17 个字符是什么?

【问题讨论】:

  • 换行多了一项。
  • 但是,我没有输入任何新行。我只是打开 vim 并输入内容然后关闭。我没有按回车。
  • 那么 vim 是一个表现良好的编辑器,它会自动在文件的最后一行末尾添加一个尾随换行符。 hexdump -C 你的文件,如果你想查看字节。
  • 使用od -c查看文件中的字符,包括换行符rtc

标签: linux bash shell unix


【解决方案1】:

当然你已经进入了。也许你看不到。考虑以下两个例子:

echo -n "This is my Input" | wc -c
16

因为-n是为了避免回车,但是

echo "This is my Input" | wc -c
17

看看这个例子也看到新的一行:

如何查看换行符?

echo "This is my Input" | od -c

od 以八进制和其他格式转储文件。 -c 选择 ASCII 字符或反斜杠转义。

这是od的文件和用法示例:

【讨论】:

  • 回显“这是我的输入”。行。在这一行,你有没有进入
  • 在这种情况下你已经进入
  • 但是使用 -n 你没有进入
  • 并非如此。考虑foo="This is my input"。该字符串中没有换行符,但是如果您尝试使用echo "$foo" | wc -c 计算其字符,则echo 命令会添加换行符。要在 bash 中计算字符串中的字符,请使用 ${#foo}
  • @FattanehTalebi 我没有说那是错误的。这是正确的。我的问题是“wc -c a.txt”。输出是 17。但是,预期的输出是 16。我也在使用下面的方法。 od -c a.txt。那时它只显示 16。这里没有添加“\n”。那么,为什么 wc 显示 17. 额外的一个字符是什么。它来自文件或'\n',我们键入以在终端中执行命令。
【解决方案2】:

在 Linux 中,当 Vim 保存缓冲区时,它将通过附加新行的行终止符来终止每一行。

您可以打开文件并输入:!xxd 来查看hex-dump 或直接使用hexdump yourfile 命令。

0000000: 5468 6973 2069 7320 6d79 2049 6e70 7574  This is my Input
0000010: 0a                                       .
~                                                                                                                                 
~                                                                                                                                 
~    

在那里你可以看到,文件在文件末尾附加了0a

所以当你使用wc -c获取这个文件的编号时,它会返回包含换行符的17

【讨论】:

    【解决方案3】:

    由于/0 字符,您拥有17

    【讨论】:

    • 这里有几个错别字 /0 而不是 \0chaeractercharacterwc -c 计算的额外字符不是 null (0),而是行终止符,可能是 \n。在 DOS 格式的文件中,你会得到 18,因为它是一个两字节的行终止符 \r\n
    【解决方案4】:

    您作为输入提供的输入字符串没有输入/换行,但 echo 正在为其分配输入/换行。而wc -cecho 命令给出的输入或换行读取。

    例如

    echo k | wc -c 
    

    返回 2,因为 k 为 1,echo 附加的新行为 1。

    虽然

    echo -n k | wc -c
    

    返回 1,因为 -n 禁止换行。

    wc -c 总是读取换行符。

    你可以试试

    printf k | wc -c 
    

    它返回 1。

    查看它在文件中的作用:

    bash-4.1$ echo 1234 > newfile
    bash-4.1$ cat newfile
    1234
    bash-4.1$ cat -e newfile
    1234$
    bash-4.1$ printf 1234 > newfile
    bash-4.1$ cat newfile
    1234bash-4.1$ cat -e newfile
    1234bash-4.1$
    

    【讨论】:

    • 但是,我只通过文件传递输入。比如“wc -c a.txt”
    • 好的,试试这个。 echo "This is my Input" > a.txt 然后运行 ​​wc -c a.txt 和 printf "This is my Input" > a.txt 然后运行 ​​wc -c a.txt。你知道我说的区别。
    • 我正在使用 ubuntu。编辑器是vim
    • 我使用的是 Linux,shell 是 ksh 和 editor vi。您可以在命令提示符上进行测试。运行 echo "My" ,在输出中您将在换行符中获得下一个提示并运行 echo -n "My" 或 printf "My" ,在输出中您将在 My 字符串之后得到提示。
    猜你喜欢
    • 2019-06-14
    • 2014-10-10
    • 1970-01-01
    • 2020-07-03
    • 2023-03-28
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多