
如何 grep 查找仅包含 5 或 6 个数字的行?像这样的东西。
情况 1(有前导空格)
10 2 12 1 13
情况 2(无前导空格)
1 2 3 4 5 6
我认为这样的事情会起作用。
grep -E '[0-9]{5}'
答案1
grep -E '[0-9]{5}'
正在寻找至少 5 位数字的数字。您需要的是 5 个至少包含一位数字的数字:
grep -E '[0-9]+([^0-9]+[0-9]+){4}'
[0-9]+
- 至少一位数的数字[^0-9]+[0-9]+
- 至少包含一位数字的数字,前面至少有一个非数字字符。然后我们重复此操作 4 次,得到 5 个由非数字分隔的数字。- 如果要求正好是 5,您可能需要用 包围该正则表达式,
[^0-9]
以便整行匹配(当然,还包括锚点)。 - 根据您想要的内容(是否
1,2,3,4,6
符合条件?),您可能会考虑其他分隔符。例如,正确的科学计数法实数如下所示:[+-]?(([0-9]+(\.[0-9]+)?)|([0-9]?\.[0-9]+))([eE][+-][0-9]+)?
因此分隔符可能不包括.
,e
等。它们可能只是空格,如mikeserv
注释。或者,如果是 CSV 记录,它们可能是逗号。或者根据区域设置,逗号将作为小数点分隔符。[^0-9]
根据您的需要而有所不同。
答案2
我会选择比 更强大的东西grep
。这可以在 perl 中完成:
perl -ne 'print if s/\d+/$&/g == 5' your_file
正则表达式替换将所有由一个或多个数字 ( \d+
) 组成的组替换为其自身 ( $&
):它不执行任何操作。它仅用于副作用,因为s///
运算符返回它设法替换其正则表达式的次数。因此,仅当s///
找到 5 组数字时才打印该行。
答案3
其他perl
:
$ perl -MList::Util=first -Tnle '
s/^\s+|\s+$//g;
@e = split /\s+/;
print if @e == 5 || @e == 6 and !first {/\D/} @e;
' file
10 2 12 1 13
解释
s/^\s+|\s+$//g
修剪线。@e = split /\s+/
将行拆分为数组@e
。如果出现以下情况,我们将打印该行:
- 数组
@e
包含 5 或 6 个元素。 - 并且其元素都不包含非数字字符(
\D
匹配非数字字符)。
- 数组
答案4
awk '{l=$0; n = gsub(/[0-9]+/, "", l)}; n == 5 || n == 6'
(与中的原理相同约瑟夫的回答)