Linux 如果从1到4321的数字被写出来,数字“5”会出现多少次?

Linux 如果从1到4321的数字被写出来,数字“5”会出现多少次?,linux,bash,shell,Linux,Bash,Shell,我已经找到了这个程序的答案,但是我真的不明白倒冲在这里意味着什么 我试图删除反冲洗,然后程序打印从1到4321的所有数字,但它没有显示数字5出现的次数 当我倒冲时,它只显示数字5出现的次数 这是我的密码: #!/bin/bash seq 4321 | \ while read -n1 digit; do echo $digit done | grep -c 5 通常情况下,当反斜杠放在命令后面时,这意味着我们告诉程序行仍在继续,应该被视为同一行命令的执行。通常,我们这样做是为了使程序更干净,

我已经找到了这个程序的答案,但是我真的不明白倒冲在这里意味着什么

我试图删除反冲洗,然后程序打印从1到4321的所有数字,但它没有显示数字5出现的次数

当我倒冲时,它只显示数字5出现的次数

这是我的密码:

#!/bin/bash
seq 4321 | \
while read -n1 digit; do
 echo $digit
done | grep -c 5

通常情况下,当反斜杠放在命令后面时,这意味着我们告诉程序行仍在继续,应该被视为同一行命令的执行。通常,我们这样做是为了使程序更干净,因为人们不应该看到一条长的线,它一直在继续,并且以不可读的形式显示

现在进入您的代码:

您不需要使用\ after seq命令,因为您使用的是|和while可以在新行中提及。此外,您的代码行不长,因此可能不需要它,也应该在没有它的情况下运行

我在没有\的情况下测试了您的代码,它对我来说运行良好

对于此任务,如果不需要使用while循环,可以直接执行以下操作:

seq 4321 | awk '{sum+=gsub(/5/,"&")} END{print sum}'
如果这对您有帮助,请尝试一下。如果我正确地了解了您的需求,这应该比循环快,然后使用grep选项。

您可以这样做

   $ seq 4321 | tr -Cd 5 | wc -c

    1262

这将删除除5以外的所有字符并计算结果

使用GNU grep,您可以这样做:

$ seq 4321 | grep -o 5 | wc -l
1262
$
根据grep的手册:

-o、 -仅匹配

仅打印匹配行中匹配的非空部分,每个此类部分位于单独的输出行上


5不是每100次出现10次吗?所以简单地除以4321/10就得到了432倍,对吗?整数除法intentional@DavidC.Rankin你似乎没有把50、51、52、53中的5都算在内。。。我用反斜杠和不用反斜杠运行了你的代码,得到了相同的结果:1262我喜欢它。gsub在替换字段中的每个字符和返回替换计数方面比sed在这种情况下更为出色。我对sed的问题是使用中间字符进行多次替换。我认为awk是一个不错的选择。只要grep-o5 | wc-l也能更优雅地完成同样的事情。最理想的是grep-oc5,但至少GNUGrep不会这样做,因为很多年来一直存在一个开放的bug,这只算55次,而不是两次。他正在使用read-n1将其拆分为不同的字符。@Barmar,谢谢您让我知道,我想-c选项会处理好的。您是对的,我测试了它,但它不会。我现在添加了一个awk程序,干杯。好的,这也很聪明。。。。