linux shell wc -c 计数字符+1

Moh*_*rmi 19 linux

我使用命令 wc -c 来计算字符数,但它给了我一个错误的数字,例如字符数加一:

echo "k" | wc -c 
Run Code Online (Sandbox Code Playgroud)

它给了我 2 个字符

那为什么不是 1?

din*_*esh 19

查看 的帮助消息wc。该-c选项打印出字符数。该echo命令默认包含一个换行符。当wc看到换行符时,它会将其视为另一个字符,因此结果中的额外计数。您可以使用下面显示的替代方法之一来解决此问题;-w计算单词-l数和计算行数。

echo "k" | wc -w 
echo "k" | wc -l
Run Code Online (Sandbox Code Playgroud)

您可以通过管道输出wctoawk以获取不包括换行符的字符数:

wc <filename> | awk '{print $3-$1}'
Run Code Online (Sandbox Code Playgroud)

wc不带选项的默认输出按此顺序打印出换行符数($1 到 awk)、单词数和字符数($3 到 awk)。

  • 啊,所以你的意思是`echo -n "k" | wc -c`。那讲得通 (6认同)
  • @user1865719:当一致性很重要时,`printf` 通常优先于 `echo`。除非特别要求,否则它不会打印换行符,所以 `printf "k" | wc -m` 给出`1`,即打印的字符数。要计算文件第一行中的字符数,可以执行例如`$(($(head -1 file | wc -m)-1))`(将其包装在`$(())` 中以进行shell 运算删除换行符计数)或者更好:使用 awk 并执行 `awk 'NR==1{print length}' file`。 (2认同)

F. *_*uri 16

当你echo "k",该echo命令将一个换行符附加到你要求它打印的任何内容(“k”)。您可以使用该-n选项禁用此功能:

echo -n k | wc -c
1
Run Code Online (Sandbox Code Playgroud)

要查看该隐形字符,您可以转储流 whithodhd

echo k | od -t c
0000000   k  \n

echo k | hd
00000000  6b 0a                                             |k.|

echo k | od -t a -A n
   k  nl
Run Code Online (Sandbox Code Playgroud)


小智 6

这是因为您正在使用echo,它会向您的字符串添加换行符。使用printf来代替:

$ echo k | wc -c 
       2
$ printf k | wc -c
       1
Run Code Online (Sandbox Code Playgroud)