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

时间:2018-01-20 16:49:45

标签: bash command-line-interface

如何使用egrep计算文件中的整数数量?

我试图将其解决为模式发现问题。实际上,我面临着如何表示字符范围[0-9] 连续的问题,其中包括" space"在开始之前和#34;空格或点'#34;结束之后。我认为后者可以通过使用\<和\>分别。此外,它不应该包括点之间,否则它不会是一个整数。我无法使用可用的工具和技术将此逻辑转换为正则表达式。

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。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

基于你想要排除66.88的观察,我猜是

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

找到一个数字,可选地后跟一个点,后跟一个空格或行尾。

-c选项表示报告包含匹配项的行数(因此,如果有包含多个匹配项的行,则不严格匹配数)并且-E选项启用常规扩展表达式语法,即传统上被称为egrep的内容(尽管命令名称现已过时)。

如果您需要计算匹配项,-o选项会在单独的一行打印每个匹配项,然后您可以将其传递给wc -l(或者在幸运的情况下与grep -c结合使用,但是首先检查;这不起作用,例如当前使用GNU grep

答案 2 :(得分:0)

在我的ubuntu上,这段代码工作正常

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