我需要一个sed命令将电话号码格式从999-999-9999更改为(999)999-9999

时间:2016-04-05 14:51:22

标签: unix sed

我需要一个sed命令才能将电话号码格式从(999)999-9999更改为sed 's/[[:digit:]]\-[[:digit:]]\-[[:digit:]]/\([[:digit:]]\)[[:digit:]]\-[[:digit:]]/gp' 。 这是我一直在尝试的:

sed 's/([0-9]{3})\-([0-9]{3})\-([0-9]{4})/\(([0-9]{3}\))([0-9]{3})\-([0-9]{4})/gp'

我也试过这个:

vertices

2 个答案:

答案 0 :(得分:2)

符号[[: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位数字,短划线,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-543210 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-543210 and (222)333-4444 and (543)432-5544
$

\b标记PCRE中的单词边界。这确实意味着a222-333-4444与Perl不匹配;你可以改进事物,坚持非数字或字符串的开头,以及匹配字符串后的非数字或字符串结尾。

$ echo "987-654-3210 and 2987-654-543210 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-543210 and a(222)333-4444 and (543)432-5544
$

或者使用(BSD或GNU)sed扩展正则表达式(显示BSD):

$ echo "987-654-3210 and 2987-654-543210 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-543210 and a(222)333-4444 and (543)432-5544
$

请注意,如果您愿意,可以将否定数字字符类表示法写为[^[:digit:]]

迭代开发有帮助。

答案 1 :(得分:1)

$ echo 123-456-7890 | sed -r 's/([0-9]{3})-([0-9]{3}-[0-9]{4})/(\1)\2/'
(123)456-7890