在插入字元之前,如何使用 sed 檢測一定數量的數字? ###-###-####

在插入字元之前,如何使用 sed 檢測一定數量的數字? ###-###-####

我需要在文字檔案中設定電話號碼的格式。它們顯示為(範例)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 位數字,如您的範例所示。

相關內容