的符號[[:digit:]]
一個單一的數字相匹配;你需要匹配重複的數字,這是通過在\{3\}
中包裝重複計數來完成的(對於固定計數;也有可變計數範圍,但它們在這裏不相關,並且*
等等)。並且您需要捕獲您在\(…\)
中匹配的內容,以便在替換中引用它們。在替換中,您使用\1
等來指代捕獲的片段。捕捉按照\(
符號的順序從左到右編號。
sed 's/\([[:digit:]]\{3\}\)-\([[:digit:]]\{3\}-[[:digit:]]\{4\}\)/(\1)\2/g'
或者:
sed 's/\([0-9]\{3\}\)-\([0-9]\{3\}-[0-9]\{4\}\)/(\1)\2/g'
這是經典的sed
符號;您也可以使用擴展正則表達式來查找變體,但根據平臺需要不同的選項,與此不同。模式查找3位數字(第一次捕捉),一個破折號,然後3個數字,另一個破折號和4位數字作爲第二次捕獲,並用開括號(美式括號),前3位數字,右括號,其餘3位數字,短劃線,4位數字。
BSD鍵(Mac OS X):
sed -E 's/([0-9]{3})-([0-9]{3}-[0-9]{4})/(\1)\2/g'
GNU:
sed -r 's/([0-9]{3})-([0-9]{3}-[0-9]{4})/(\1)\2/g'
注意,所有這些正則表達式會轉換
9876-345-54321
到:
9(876)345-54321
修復不那麼無關緊要,特別是在sed
。使用Perl:
$ echo "987-654-3210 and 2987-654-and 222-333-4444 and 543-432-5544" |
> perl -p -e 's/\b([0-9]{3})-([0-9]{3}-[0-9]{4})\b/(\1)\2/g'
(987)654-3210 and 2987-654-and (222)333-4444 and (543)432-5544
$
\b
在PCRE中標記了一個字邊界。這確實意味着a222-333-4444
與Perl不匹配;你可以改進一些東西來堅持非數字或字符串的開始,以及非字符串或字符串結束後的匹配字符串。
$ echo "987-654-3210 and 2987-654-and a222-333-4444 and 543-432-5544" |
> perl -p -e 's/(^|\D)([0-9]{3})-([0-9]{3}-[0-9]{4})(\D|$)/\1(\2)\3\4/g'
(987)654-3210 and 2987-654-and a(222)333-4444 and (543)432-5544
$
或用(BSD或GNU)sed
擴展正則表達式(顯示BSD):
$ echo "987-654-3210 and 2987-654-and a222-333-4444 and 543-432-5544" |
> sed -E 's/(^|[^0-9])([0-9]{3})-([0-9]{3}-[0-9]{4})([^0-9]|$)/\1(\2)\3\4/g'
(987)654-3210 and 2987-654-and a(222)333-4444 and (543)432-5544
$
需要注意的是,如果你想在否定數字字符類符號可以寫[^[:digit:]]
。
迭代開發有幫助。
'[[:digit:]]'單位匹配一個數字,而不是三位數。 –