grep|awk|sed正则匹配有效电话号码(LeetCode)

力扣题目要求如下:

给定一个包含电话号码列表(一行一个电话号码)的文本文件 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

猜你喜欢

转载自blog.csdn.net/Sunny_Future/article/details/106629974