我需要在文本文件中设置电话号码的格式。它们显示为(示例)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 位数字,如您的示例中所示。