我需要在文字檔案中設定電話號碼的格式。它們顯示為(範例)8014516912
我將如何格式化它,以便我可以-
在前 3 個數字之後插入一個,然後-
在另外 3 個數字之後插入另一個,所以它會顯示為801-451-6912
我該如何對所有包含電話號碼的線路執行此操作?請記住,電話號碼位於文字之間,因此這些號碼並不總是處於相同的索引。例如它可以是這樣的:
atewfnwieug 8204919561
adw 8915617141
答案1
為此,您需要數字量詞:
sed -r 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/\1-\2-\3/' your_file
此-r
開關支援擴展正則表達式,但不是 POSIX,因此更可移植的解決方案是
perl -pe 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/$1-$2-$3/' your_file
在擴展正規表示式中,量詞{n,m}
意味著至少n
一次和最多m
次數匹配前一個原子。例如,量詞?
可以表示為{0,1}
。省略m
表示沒有上限:+
可以寫成{1,}
。最後,{n}
平均值與前一個原子精確匹配n
。
如果您想使用sed
,則並不需要為此使用擴充的正規表示式;只是基本的正規表示式形式的可讀性較差:
sed 's/\b\([0-9]\{3\}\)\([0-9]\{3\}\)\([0-9]\{4\}\)\b/\1-\2-\3/' your_file
答案2
我會使用 perl 來代替:
$ perl -pe 's/\b(\d{3})(\d{3})(\d{4})\b/$1-$2-$3/' foo.txt
atewfnwieug 820-491-9561
adw 891-561-7141
您也可以就地執行此操作,sed
例如:
$ perl -i.bak -pe 's/\b(\d{3})(\d{3})(\d{4})/$1-$2-$3\b/' foo.txt
如果您的電話號碼可以與這樣的字母相鄰:
abcd1234567890abc
abcd1234567890
1234567890abc
你可以用這個來代替:
$ perl -pe 's/([^\d]*)(\d{3})(\d{3})(\d{4})([^\d]*)/$1$2-$3-$4$5/' foo.txt
abcd123-456-7890abc
abcd123-456-7890
123-456-7890abc
所有這些選項都假設電話號碼始終為 10 位數字,如您的範例所示。