所以我有一个文本文件:
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。