你将如何 grep 只包含 5 或 6 个数字的行?像这样的东西。
case 1(有前导空格)
10 2 12 1 13
Run Code Online (Sandbox Code Playgroud)
情况 2(无前导空格)
1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
我认为这样的事情会奏效。
grep -E '[0-9]{5}'
Run Code Online (Sandbox Code Playgroud)
grep -E '[0-9]{5}'
正在寻找至少有 5 位数字的数字。您需要的是 5 个至少有一位的数字:
grep -E '[0-9]+([^0-9]+[0-9]+){4}'
Run Code Online (Sandbox Code Playgroud)
[0-9]+
- 至少一位数 [^0-9]+[0-9]+
- 一个至少有一位数字,前面至少有一个非数字字符的数字。然后我们重复 4 次,得到 5 个由非数字分隔的数字。[^0-9]
以便整行匹配(当然还有锚点)。1,2,3,4,6
符合条件?),您可能会查看其他分隔符。例如,适当的科学记数法实数会是什么样子:[+-]?(([0-9]+(\.[0-9]+)?)|([0-9]?\.[0-9]+))([eE][+-][0-9]+)?
所以分离器可能不包括.
,e
等他们可能只是空白,如mikeserv
笔记。或者他们可能是逗号,如果它是一个 CSV 记录。或者根据区域设置,逗号将是小数点分隔符。改变[^0-9]
按您的需要。我会选择比 更强大的东西grep
。这可以在 perl 中完成:
perl -ne 'print if s/\d+/$&/g == 5' your_file
Run Code Online (Sandbox Code Playgroud)
正则表达式替换将所有由一个或多个数字 ( \d+
) 组成的组替换为其自身 ( $&
):它不执行任何操作。它仅用于副作用,因为s///
运算符返回它设法替换其正则表达式的次数。s///
因此,仅当找到 5 组数字时才打印该行。