我有一个包含许多不同邮政编码的文件:
12345
12345-6789
1234567890
12345:6789
12345-7890
12:1234678
Run Code Online (Sandbox Code Playgroud)
我只想匹配具有格式代码12345或12345-6789,却忽略所有其他形式.
我有我的正则表达式:
grep -E '\<[0-9]{5}\>[^[:punct:]]|\<[0-9]{5}\>-[0-9]{4}' samplefile
它匹配,12345-6789因为"或"子句匹配该特定的一个.我很困惑为什么它在第一次不匹配,12345因为我的表达应该说"匹配5个数字但忽略任何标点符号".
小智 9
与所需输出匹配的表达式为:
egrep "^[0-9]{5}([-][0-9]{4})?$" samplefile
Run Code Online (Sandbox Code Playgroud)
表达细分:
^[0-9]{5} - 找到以5位数开头的行.^表示行的开始,[0-9]{5}表示零到九之间正好是五位数.
([-][0-9]{4})?$ - 可能以短划线和四位数结束,或者根本不结束.()将表达式分组在一起,[-]表示短划线字符,[0-9]{4}正好表示0到9之间的四位数,?表示分组表达式完全存在或不存在并$标记该行的结尾.
TEST.DAT
12345
12345-6789
1234567890
12345:6789
12345-7890
12:1234678
Run Code Online (Sandbox Code Playgroud)
在测试数据上运行表达式:
mike@test:~$ egrep "^[0-9]{5}([-][0-9]{4})?$" test.dat
12345
12345-6789
12345-7890
Run Code Online (Sandbox Code Playgroud)
附加信息:grep -E也可以写成egrep.这也适用于grep -F哪个fgrep和grep -r哪个相同rgrep.