匹配特定數字串

2021-09-20 08:19:58 字數 1546 閱讀 2292

定義乙個file.txt檔案,包含內容如下

$ cat

file

.txt

987-123-4567

123456

7890

(123) 456-7890

222122-213-321

21231-456

7894

321984-4984

(218)-393-3399

(001) 345-0000

要求列印出格式如 (***) ***-***x or ***-***-***x. (x means a digit)的行

grep -e "[[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]][[:digit:]]|([[:digit:]][[:digit:]][[:digit:]]) [[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]][[:digit:]]" file.txt

得到:987-123-4567

321 984-4984

這樣搜不到

(001) 345-0000

grep -e "\([[:digit:]][[:digit:]][[:digit:]]\) [[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]][[:digit:]]|[[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]]-[[:digit:]][[:digit:]][[:digit:]][[:digit:]]" file.txt

得到987-123-4567

(123) 456-7890

(001) 345-0000

把括號轉義一下,括號兩邊都需要轉義;可以滿足條件

這種做法看起來太笨了,有多少個數字就得重複多少次[[:digit:]]

這是區域性條件符合就會匹配,比如111(001) 345-0000也能匹配進來;並不是完全匹配的

換一種做法,用正則來匹配數字

cat file.txt | grep -eo '^(\([0-9]\) )[0-9]-[0-9]$|^([0-9]-)[0-9]$'

這裡有兩個匹配條件

^(\([0-9]\) )[0-9]-[0-9]$ 匹配形如(123) 456-7890的**號碼

^([0-9]-)[0-9]$ 匹配形如987-123-4567的**號碼

用sed來找

#using sed

sed -n -e '/^([0-9]-|\([0-9]\) )[0-9]-[0-9]$/p' file.txt

#using grep in perl mode

grep -p '^(\d-|\(\d\) )\d-\d$' file.txt

整數字串轉化

1.用程式設計的方法將整數轉化成字串 整數轉化成字串,可以採用加 0 再逆序的辦法,整數加 0 就會隱性轉換成char型別的數。include include using namespace std int main void temp i 0 i i 1 while i 0 str j 0 cou...

貪心 數字串

描述 description 給你乙個長度為n的數字串,數字串裡會包含1 m這些數字。如果連續的一段數字子串包含了1 m這些數字,則稱這個數字字串為num串。你的任務是求出長度最短的num串是什麼,只需要輸出這個長度即可。1 n,m 200000 輸入格式 input format 第一行給定n和m...

數字串 (樹狀陣列)

原題 wannafly挑戰賽15 d 題意 給乙個數字串,每次操作改變乙個位置的數字,求每次操作後,有多少個子串滿足以下要求 長度在區間 l,r 內 首數字 尾數字 解析 對於乙個位置p,求的是乙個sum p r 1到p l 1範圍內數字大於p位置的個數和p l 1到p r 1範圍內數字小於p位置的...