力扣题目要求如下:
给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个 bash 脚本输出所有有效的电话号码。
你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)
你也可以假设每行前后没有多余的空格字符。
示例:
假设 file.txt 内容如下:
987-123-4567
123 456 7890
(123) 456-7890
你的脚本应当输出下列有效的电话号码:
987-123-4567
(123) 456-7890
分析题干
题中谈到每行只有一个号码,号码呢只有两种格式,行外没有多余空格。好了,搞起~
- 过滤字符,shell工具常用的还是grep、awk、sed
- 提炼正则条件之后,三者通吃
条件 | 含义 |
---|---|
^ | 匹配开头 |
$ | 匹配结尾 |
[0-9]{3} | 匹配字符集0-9内,3个字符 |
| | 或 |
这里匹配该条件的正则表达式:’^([0-9]{3}-|([0-9]{3}) )[0-9]{3}-[0-9]{4}$’
原文件内容 file.txt
# cat file.txt
987-123-4567
123 456 7890
(123) 456-7890
- 调配参数各自玩耍
grep式
grep -E '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt
- -E 参数表示匹配正则
awk式
awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt
- ‘/…/’ 格式表示匹配正则输出
sed式
sed -n -r '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/p' file.txt
- -r 参数表示匹配正则
- -n 参数表示关闭每行输出(默认会每行输出,影响输出结果),只打印符合条件字符串
- '/…/'p ,将符合条件的字符串打印显示。通常 p 会与参数 sed -n 一起执行
输出结果皆为:
987-123-4567
(123) 456-7890
题目内容来源力扣,链接:https://leetcode-cn.com/problems/valid-phone-numbers