Grep 查找仅包含 5 或 6 个数字的行

Grep 查找仅包含 5 或 6 个数字的行

如何 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' 

(与中的原理相同约瑟夫的回答

相关内容