定义一个file.txt文件,包含内容如下
$ cat file.txt 987-123-4567 123 456 7890 (123) 456-7890 222122-213-321 21 231-456 7894 321 984-4984 (218)-393-3399 (001) 345-0000
要求打印出格式如 (xxx) xxx-xxxx or xxx-xxx-xxxx. (x means a digit)的行
grep -E "[[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]][[:digit:]]|([[:digit:]][[:digit:]][[:digit:]]) [[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]][[:digit:]]" file.txt
得到:
987-123-4567
321 984-4984
这样搜不到
(001) 345-0000
grep -E "\([[:digit:]][[:digit:]][[:digit:]]\) [[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]][[:digit:]]|[[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]][[:digit:]]" file.txt
得到
987-123-4567
(123) 456-7890
(001) 345-0000
把括号转义一下,括号两边都需要转义;可以满足条件
这种做法看起来太笨了,有多少个数字就得重复多少次[[:digit:]]
这是局部条件符合就会匹配,比如111(001) 345-0000也能匹配进来;并不是完全匹配的
换一种做法,用正则来匹配数字
cat file.txt | grep -Eo ‘^(\([0-9]{3}\) ){1}[0-9]{3}-[0-9]{4}$|^([0-9]{3}-){2}[0-9]{4}$‘
这里有两个匹配条件
^(\([0-9]{3}\) ){1}[0-9]{3}-[0-9]{4}$ 匹配形如(123) 456-7890的电话号码
^([0-9]{3}-){2}[0-9]{4}$ 匹配形如987-123-4567的电话号码
#using sed
sed -n -E ‘/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/p‘ file.txt
#using grep in Perl mode
grep -P ‘^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$‘ file.txt