我有一个包含一堆不同邮政编码的文件:
12345
12345-6789
1234567890
12345:6789
12345-7890
12:1234678
我只想匹配格式为 12345
或 12345-6789
的代码,但忽略所有其他形式。
我的正则表达式为:
grep -E '\<[0-9]{5}\>[^[:punct:]]|\<[0-9]{5}\>-[0-9]{4}' samplefile
它与 12345-6789
匹配,因为“or”子句与该特定代码匹配。我很困惑为什么它在第一个 12345
上不匹配,因为我的表达式应该说“匹配 5 个数字,但忽略任何标点符号。”
最佳答案
与您所需的输出相匹配的表达式是:
egrep "^[0-9]{5}([-][0-9]{4})?$" samplefile
表达式分割:
^[0-9]{5}
- 查找以 5 位数字开头的行。 ^
表示行首,[0-9]{5}
表示 0 到 9 之间的五位数字。
([-][0-9]{4})?$
- 可能以破折号和四位数字结尾,也可能什么也不结尾。 ()
将表达式分组在一起,[-]
表示破折号字符,[0-9]{4}
表示零之间的四位数字九、?
表示分组表达式完全存在或不存在,$
标记行尾。
测试.dat
12345
12345-6789
1234567890
12345:6789
12345-7890
12:1234678
在测试数据上运行表达式:
mike@test:~$ egrep "^[0-9]{5}([-][0-9]{4})?$" test.dat
12345
12345-6789
12345-7890
附加信息:grep -E
也可以写成 egrep
。这也适用于与 fgrep
相同的 grep -F
和与 rgrep
相同的 grep -r
>.
关于正则表达式匹配没有标点符号的邮政编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14868471/