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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章