Regex 命令打印电话号码,方法是用括号将区号(电话号码的前3位数字)突出显示

Regex 命令打印电话号码,方法是用括号将区号(电话号码的前3位数字)突出显示,regex,awk,sed,formatting,phone-number,Regex,Awk,Sed,Formatting,Phone Number,注意 文件中可能有一些记录缺少姓名,只有电话号码,反之亦然。这些记录应视为无效记录,不应显示在输出中。甚至不应在这些记录的输出中键入空行 样本输入: Danish 5555551212 3456782 Bulbul 5555551213 Kaloana 5555551214 Tina 6665551215 Cj Mayuri 6665551216 输出: (555)5551212 (555)5551213 (555)5551214 (666)5551215 (666)5551216 霉菌代码

注意 文件中可能有一些记录缺少姓名,只有电话号码,反之亦然。这些记录应视为无效记录,不应显示在输出中。甚至不应在这些记录的输出中键入空行

样本输入:

Danish 5555551212
3456782
Bulbul 5555551213
Kaloana 5555551214
Tina 6665551215
Cj
Mayuri 6665551216
输出:

(555)5551212
(555)5551213
(555)5551214
(666)5551215
(666)5551216
霉菌代码:

BEGIN {FS=" ";c=0;}
{   
    if(NF>1)
    {
      s[c]=$2;
    c=c+1
    }
}

END{
  for (i=0;i<c;i++)
  {
    print s[i] 
  }

   

}
BEGIN{FS=”“;c=0;}
{   
如果(NF>1)
{
s[c]=2元;
c=c+1
}
}
结束{

对于(i=0;i,使用GNU awk。使用正则表达式(
^[0-9]+$
)检查)如果第二列仅包含数字,请打印第二列:

awk '$2~/^[0-9]+$/{print $2}' file
输出:

5555551212 5555551213 5555551214 6665551215 6665551216 (555)5551212 (555)5551213 (555)5551214 (666)5551215 (666)5551216 输出:

5555551212 5555551213 5555551214 6665551215 6665551216 (555)5551212 (555)5551213 (555)5551214 (666)5551215 (666)5551216 (555)5551212 (555)5551213 (555)5551214 (666)5551215 (666)5551216 这可能适用于您(GNU-sed):

关闭隐式打印
-n

匹配有效电话号码时,请将前3位数字用括号括起来,并仅打印号码


解决方案包括一个替换命令,格式为
s/LHS/RHS/
,其中RHS/LHS代表右侧/左侧

LHS是与模式空间中的内容相匹配的regexp,即当前行在其换行符被删除后放置在其中的缓冲区

RHS是放置LHS中匹配的替换件的位置

/
是替换命令的分隔符,通常使用
/
,但它几乎可以是任何其他字符,例如
.
%

正则表达式或正则表达式由
^\S+\S([0-9]{3})([0-9]+)$

^
表示行首的位置,
$
同样表示行尾的位置

\S
表示非空白字符它是
\S
的对偶,表示空白字符,例如空格或制表符

+
表示前面的一个或多个字符(或组),
*
几乎相同,只是它表示零个或多个,
表示可选的(零个或一个),而
{3}
正好表示3。因此
x{3}
xxx
相同

(…)
表示一个组,
可以是文字字符,字符类、组、替换、反向引用或它们的组合。可以稍后在替换命令的LHS或RHS中引用该组,它们从左到右编号为
\1
\9
,因此
(abc)\1\1
表示
abcabc

[0-9]
是从
0
9
的数字字符类

因此,LHS的意思是:从行首开始,后跟一个或多个非空格字符,后跟一个空格字符,后跟一个3位数的分组(
\1
),后跟一个或多个位数的分组(
\2
),后跟行尾

RHS表示:文字
,后跟第一组,即电话号码的前3位,后跟文字
,后跟第二组,即电话号码的剩余数字


如果替换成功,则替换的结果将打印到标准输出,因为存在
p
标志。由于
-n
选项正在运行,这意味着只打印匹配的行。

请尝试以下内容。仅使用显示的样本链接编写和测试

awk '
NF==2 && match($2,/^[0-9]{3}/){
  print "(" substr($2,RSTART,RLENGTH) ")" substr($2,RSTART+RLENGTH)
}
' Input_file
说明:检查条件if
NF
为2意味着如果行有2个字段,第2个字段以3位数字开头,则执行以下操作。打印(然后是第2个字段的3位子字符串,然后打印)和行的其余部分