【LeetCode 簡單題】47-有效電話號碼個數
宣告:
今天是第47道題。給定一個包含電話號碼列表(一行一個電話號碼)的文字檔案 file.txt
,寫一個 bash 指令碼輸出所有有效的電話號碼。以下所有程式碼經過樓主驗證都能在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
解法1。用grep命令,自帶正則表示式來找到符合pattern的號碼。耗時16 ms, 在Valid Phone Numbers的Bash提交中擊敗了72.12% 的使用者,程式碼如下。
-
grep 命令被用來檢索一臺伺服器或工作站上任何位置的文字資訊
-
-P:表示列印操作(?存疑)
-
^:開始標記
-
$:結束標記
-
\d:表示數字
-
{N}:
- 匹配前一個字元N次
grep -P '^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$' file.txt
解法2。用awk命令,正則表示式和上面的差不多,但顯然效率高很多。耗時12 ms, 在Valid Phone Numbers的Bash提交中擊敗了95.73% 的使用者,程式碼如下。
- awk:一個強大的文字分析工具,在對文字檔案的處理以及生成報表,awk是無可替代的。awk認為文字檔案都是結構化的,它將每一個輸入行定義為一個記錄,行中的每個字串定義為一個域(段),域和域之間使用分割符分割
- '/……/':表示中間的是要匹配的正則表示式,省略號……表示上式中的正則表示式
- ^:匹配一行的開頭
- $:在正則表示式中匹配行尾
- [0-9]:表示匹配0-9的數字
- {3}:表示[0-9]內的數字出現3次
- |:運算子或
awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt
解法3。使用sed命令,耗時12 ms, 在Valid Phone Numbers的Bash提交中擊敗了95.73% 的使用者 ,程式碼如下。
- sed:一款流編輯工具,用來對文字進行過濾與替換工作, sed通過輸入讀取檔案內容,但一次僅讀取一行內容進行某些指令處理後輸出,sed更適合於處理大資料檔案。
- -n:表示關閉預設輸出,預設將自動列印所有行,這樣就不會打印出不符合要求的數字串了
- -r:表示支援擴充套件正則+ ? () {} |。後面的正則表示式和上面都相同,就是後面多了一個p
- p:在用sed時,p和-n合用,表示列印某一行,這樣才能把符合要求的行打印出來:
- [0-9]:表示匹配0-9的數字,也可以替換成:\d
sed -n -r '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/p' file.txt
結尾
解法1:https://blog.csdn.net/sinat_20177327/article/details/81590509
解法2:http://www.cnblogs.com/grandyang/p/5389375.html
解法3:http://www.cnblogs.com/grandyang/p/5389375.html