我需要一个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
答案 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