我将如何使用 sed 在插入字符之前检测一定数量的数字?###-###-####

Joh*_*ohn 3 command-line bash sed

我需要在文本文件中格式化电话号码。它们显示为(示例)8014516912

我将如何格式化它以便我可以-在前 3 个数字之后插入一个,然后-在另外 3 个数字之后插入一个,所以它会显示为801-451-6912

我将如何对包含电话号码的所有行执行此操作?请记住,电话号码位于文本之间,因此这些号码并不总是位于同一索引处。例如它可以是这样的:

atewfnwieug 8204919561
adw 8915617141
Run Code Online (Sandbox Code Playgroud)

Jos*_* R. 5

为此,您需要数字量词:

sed -r 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/\1-\2-\3/' your_file
Run Code Online (Sandbox Code Playgroud)

-r启用扩展正则表达式的开关不是 POSIX,因此更便携的解决方案是

perl -pe 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/$1-$2-$3/' your_file
Run Code Online (Sandbox Code Playgroud)

在扩展的正则表达式中,量词{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
Run Code Online (Sandbox Code Playgroud)

  • 这些年来事情发生了变化,我使用 sed 4.7 和 --help 显示:“-E、-r、--regexp-extended 在脚本中使用扩展正则表达式(为了可移植性,使用 POSIX -E)。” (2认同)