使用命令行界面计算文件中整数的数量

3
如何使用egrep计算文件中整数的数量?
我尝试将其解决为一个模式查找问题。实际上,我遇到了如何表示连续的字符范围[0-9]的问题,包括在开头之前的“空格”和在末尾之后的“空格或点”。我认为后者可以通过分别使用\<和\>来解决。此外,它不应该在中间包含点,否则它就不是整数了。我无法使用现有的工具和技术将这种逻辑转换为正则表达式。
My name is 2322.
33 is my sister.
I am blessed with a son named 55.
Why are you so 69. Is everything 33.
66.88 is not an integer
55whereareyou?

正确答案应该是5,即为2322、33、55、69和33。

[0-9][ .]?这不是很容易吗? - user202729
双反引号只是格式错误。我们在这里使用反引号来格式化 代码,但 @user202729 显然打错了字。 (建议的正则表达式不排除浮点数,因此如果您要求排除浮点数,则无法正常工作。) - tripleee
@tripleee 在代码开头放置空格是不可能的。 - user202729
“咦”?今天我学到了。简单的解决方法是在备注前面加上一些内容,但这确实是一个错误。(不过,你为什么要在开头加上空格呢?) - tripleee
仅供参考,@user202729的问题的解决方法在这里:https://meta.stackoverflow.com/questions/297113/how-to-insert-a-space-as-a-first-character-inside-of-backticks-in-comments - tripleee
显示剩余2条评论
3个回答

4
                    grep -Eo '(^| )([0-9]+[\.\?\=\:]?( |$))+' | wc -w
                          ^^    ^     ^       ^        ^   ^     ^
                          ||    |     |       |        |   |     |
E = extended regex--------+|    |     |       |        |   |     |
o = extract what found-----+    |     |       |        |   |     |
starts with new line or space---+     |       |        |   |     |
digits--------------------------------+       |        |   |     |
optional dot, question mark, etc.-------------+        |   |     |
ends with end line or space----------------------------+   |     |
repeat 1 time or more (to detect integers like "123 456")--+     |
count words------------------------------------------------------+

注意:123、123?和123:也被视为整数。
测试:
#!/bin/bash

exec 3<<EOF
My name is 2322.
33 is my sister.
I am blessed with a son named 55.
Why are you so 69. Is everything 33.
66.88 is not an integer
55whereareyou?
two integers 123 456.
how many tables in room 400? 50.
50? oh I thought it was 40.
23: It's late, 23:00 already
EOF

grep -Eo '(^| )([0-9]+[\.\?\=\:]?( |$))+' <&3 | \
  tee >(sleep 0.5; echo -n "integer counted: "; wc -w; )

输出:

 2322.
33 
 55.
 69. 
 33.
 123 456.
 400? 50.
50? 
 40.
23: 
integer counted: 12

谢谢你的答复,但我对Linux还很陌生,有些东西我还不太明白。我想在发帖之前应该更加努力地尝试解决它。也许再过一两天,我就能解决这个问题了。顺便说一下,再次感谢你! - Delsilon
这里没有任何规定使用“-P”选项,它也不是标准或可移植的。对于这个相对简单的正则表达式,“-E”同样适用。(也许有一天Perl正则表达式将在任何地方都可用;但那时这个命令可能就不叫“grep”了。) - tripleee

1

根据您想要排除66.88的观察,我猜测

grep -Ec '[0-9]\.?( |$)' file

该命令查找一个数字,后面可以跟一个点,然后是空格或行尾。

-c选项表示报告包含匹配项的行数(因此如果有一行包含多个匹配项,则不严格等于匹配项数),-E选项启用扩展正则表达式语法,即传统上称为egrep(虽然现在该命令名已经过时)。

如果您需要计算匹配项数,-o选项会将每个匹配项打印到单独的行中,然后您可以将其传递给wc -l(或在幸运的情况下与grep -c组合使用,但请先检查;例如,目前不能在GNU grep中使用)。


1
我建议不使用-c选项进行测试。 - Cyrus

0

在我的Ubuntu上,这段代码运行良好

grep -P '((^)|(\s+))[-+]?\d+\.?((\s+)|($))' test

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