我定期收到一个文本文件,其中的电话号码格式各异:##########
、###-###-####
、(###) ###-###
等。通常有十位数字,但我见过+1 (###) ###-####
。
最终该文件被导入到数据库中,但由于我不会详细说明的原因,让电话号码具有标准格式(###) ###-####
.
唯一不变的是电话号码始终位于每行的第二个和第三个制表符之间。
有没有办法从命令行执行此操作?
答案1
只要文件符合您所描述的那样,这应该涵盖您。该命令会保留电话号码前后的信息,并按照您要求的方式对其进行格式化。如果输出看起来不错,请添加选项-i
以sed
就地编辑它或> output_file
在最后使用它提供输出重定向。
sed -E "s/(.*\t.*\t)\+?1?[[:space:]]?\(?([0-9]{3})\)?.*([0-9]{3}).*([0-9]{4})(.*)/\1\(\2\)\ \3-\4\5/g" filename
我在包含以下文本的文件上测试了它:
jfk 902-765-9292 hat jump cat
jk 902 819 2244 hat jump cat
98 902 823-4456 hat jump cat
78h +1 075 242 1566 hat jump cat
jklj kjlj +1 075-242-1566 hat jump cat
jk jkj +1 (075) 242-1566 hat jump cat
kj (204) 799-9810 hat jump cat
kj 89 (204)-799-9810 hat jump cat
输出是:
jfk (902) 765-9292 hat jump cat
jk (902) 819-2244 hat jump cat
98 (902) 823-4456 hat jump cat
78h (075) 242-1566 hat jump cat
jklj kjlj (075) 242-1566 hat jump cat
jk jkj (075) 242-1566 hat jump cat
kj (204) 799-9810 hat jump cat
kj 89 (204) 799-9810 hat jump cat
答案2
您可以构建与任何格式匹配的正则表达式,并捕获数字,然后将其重新替换为您所需的格式。
例如,要使用扩展正则表达式 (ERE) 匹配和捕获可选用括号括起来的三个十进制数字序列,您可以在 matches\(?([0-9]{3})\)?
时写入[- ]?
可选的连字符或空格。以此方式构建
\(?([0-9]{3})\)?[- ]?([0-9]{3})[- ]?([0-9]{4})
将匹配 3 个数字(可选)带括号,可选后跟连字符或空格,然后匹配更多数字(可选后跟连字符或空格),后跟 4 位数字。
在替换中应用表达式sed
:
$ cat <<EOF | sed -E 's/\(?([0-9]{3})\)?[- ]?([0-9]{3})[- ]?([0-9]{4})/(\1) \2-\3/g'
I periodically receive a text file with phone numbers formatted
in wildly different ways: 123 456-7890, 123 456-7890, 123 456-7890,
etc. Usually there's ten digits, but I've seen +1 555 456-7890.
EOF
I periodically receive a text file with phone numbers formatted
in wildly different ways: (123) 456-7890, (123) 456-7890, (123) 456-7890,
etc. Usually there's ten digits, but I've seen +1 (555) 456-7890.
答案3
您需要匹配字段并重新格式化它;这是一个 awk 脚本,它查找三个变体并重新格式化它们(在默认打印重构的行之前):
$3 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 1, 3) ") " substr($3, 4, 3) "-" substr($3, 7, 4)
}
$3 ~ /^[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 1, 3) ") " substr($3, 5, 3) "-" substr($3, 9, 4)
}
$3 ~ /^\+1 \([0-9][0-9][0-9]\) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 5, 3) ") " substr($3, 10, 3) "-" substr($3, 14, 4)
}
1
将其保存到文件中,也许是phone.awk
,然后使用: 调用它awk -F $'\t' -f phone.awk < input
。