用sed打印手机号码

时间:2017-01-21 19:18:31

标签: awk sed grep

我有这样的输入记录:

Addison Clark asdj asjdasjd asjdasndasd 9098890099  BE ME BA
Debby Adam asjhdj23 j23 j123jn123 123jnwjb12hg3  123jh123 jhj23 123 9283774849 MBA MIB PHD BE BA

其中前两列包含姓氏和姓氏,每行中的其余文本可以包含任何内容,包括手机号码。我的目标是提取姓名和手机号码。

我试过了

sed -re 's/^(\b\w+\b) (\b\w+\b).*([0-9]{10}).*/\1 \2 \3/'

完全没问题,但是当我把它改成

sed -re 's/^(\b\w+\b) (\b\w+\b).*([0-9]+).*/\1 \2 \3/'

它仅打印移动设备中的第一个数字,但不打印整个移动设备号码。知道第二个命令可能有什么问题吗?

1 个答案:

答案 0 :(得分:1)

只需将Awk与默认字段分隔符

一起使用即可
awk '{for(i=3;i<=NF;i++){if ($i ~ /^[[:digit:]]{10}$/) { number=$i; break } } printf "%s %s %s\n",$1,$2,number }' file
Addison Clark 9098890099
Debby Adam 9283774849

我们的想法是从3rd字段循环到文件的末尾以匹配移动电话号码模式,一旦发现中断了循环并打印其余字段。

请注意这一点regEx tester page,它代表您的[0-9]+匹配,

3rd Capturing Group ([0-9]+)
Match a single character present in the list below [0-9]+
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57)

查看+量词意味着从this page获取的内容,

  

限制重复

     

还有一个额外的量词,可以指定令牌重复的次数。 语法为{min,max},其中min为零或表示最小匹配数的正整数,max为等于或大于min的整数,表示最大匹配数。如果逗号存在但省略了max,则最大匹配数为无限。 所以{0,1}与?相同,{0,}与*相同,{1,}与+相同。省略逗号和最大值会告诉引擎完全重复令牌次数

所以[0-9]+字面意思是匹配单个或多个字符,最小值为1。