Grep 显示额外的行

Grep 显示额外的行

所以我有一个文本文件:

4556 4618 7843 8732
 4532 0861 1932 5122 
3478 893* 6788 6312
5440 3173 8207 0451 67886
6011 2966 7184 4668       
3678 3905 5323
  2389 4387        9336 2783  
239 235 453 3458
182 534 654 765
 4485 0721 1308 2759
46759 543 2345

我只想 grep 4 位数在一起的数字,连续 4 次(用空格分隔)。

例如:4556 4618 7843 8732

我在用: grep -E "([0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4})" test.txt

这告诉我:

4556 4618 7843 8732
 4532 0861 1932 5122 
5440 3173 8207 0451 67886
6011 2966 7184 4668       
 4485 0721 1308 2759

使用此功能会出现一条不应出现的额外行,其中有第五组数字,末尾有 5 位数字。

所以我用了: grep -E "([0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4})$" test.txt

但这只给了我两个结果,而不是应有的 4 个结果:

4556 4618 7843 8732
 4485 0721 1308 2759

有人可以告诉我我做错了什么吗?

答案1

$ grep -E '^[[:blank:]]*[0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4}[[:blank:]]*$' file
4556 4618 7843 8732
 4532 0861 1932 5122
6011 2966 7184 4668
 4485 0721 1308 2759

你的表情与四行相匹配或者更多由空格分隔的四位数字组。括号在表达式中不执行任何操作。

上面的表达式将模式锚定到行的开头和结尾,并且只允许在第一组数字之前和最后一组数字之后存在空格或制表符。

^作为使用和锚点的替代方法$,您可以使用grep -x

grep -Ex '[[:blank:]]*[0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4}[[:blank:]]*'

并缩短这个,就像杰夫所展示的那样,

grep -Ex '[[:blank:]]*([0-9]{4} ){3}[0-9]{4}[[:blank:]]*'

答案2

你已经用线尾锚点到达了一半$;您只需要也用 来锚定该行的开头^。看来您可以使用前导空格,因此也请考虑到这一点*

grep -E "^ *([0-9]{4} [0-9]{4} [0-9]{4} [0-9]{4})$" test.txt

如果有助于简化输入(或理解),您可以组合前三种模式:

grep -E "^ *([[:digit:]]{4} ){3}[[:digit:]]{4}$"

...意味着您需要 3 个数量(4 位数字后跟一个空格),然后是一个空格,然后是 4 位数字,然后是 EOL。

相关内容