力扣題目要求如下:
給定一個包含電話號碼列表(一行一個電話號碼)的文本文件 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