在插入字符之前,如何使用 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 位数字,如您的示例中所示。

相关内容