Bash脚本问题:如何提取文本中特定格式的电话号码?
修复你的电话号码提取脚本
我来帮你一步步解决这个问题,你的脚本主要有两个问题:语法错误和正则表达式与目标格式不匹配,咱们逐个修复:
1. 修正脚本语法错误
你的while read phone do部分缺少了分隔符,bash需要明确区分read phone和do,正确的写法是给read phone后面加个分号,或者把do单独放一行:
grep -E -o "正则表达式" webpage.html | while read phone; do echo "$phone" >> testp.txt done
2. 编写匹配目标格式的正则表达式
你要提取的号码格式是(XXXXX) XXXXXX XXXXX XXXXXX (XXXXX)XXXXXX,对应的正则需要精准匹配每个结构:
- 开头的
(XXXXX):括号是正则特殊字符,需要用\转义,即\([0-9]{5}\) - 空格+6位数字:
[0-9]{6} - 空格+5位数字:
[0-9]{5} - 空格+6位数字:
[0-9]{6} - 空格+(XXXXX):
\([0-9]{5}\) - 最后6位数字:
[0-9]{6}
结合起来,完整的正则表达式是:
\([0-9]{5}\) [0-9]{6} [0-9]{5} [0-9]{6} \([0-9]{5}\)[0-9]{6}
3. 最终完整脚本
把修正后的语法和正则结合,完整脚本如下:
grep -E -o "\([0-9]{5}\) [0-9]{6} [0-9]{5} [0-9]{6} \([0-9]{5}\)[0-9]{6}" webpage.html | while read phone; do echo "$phone" >> testp.txt done
额外小提示
- 如果担心号码前后有多余的空白干扰匹配,可以在正则的首尾加上
\b(单词边界),比如:\b\([0-9]{5}\) [0-9]{6} [0-9]{5} [0-9]{6} \([0-9]{5}\)[0-9]{6}\b - 你用了
-E选项开启扩展正则,所以大括号{}不需要转义,写法更直观;如果去掉-E用基本正则,才需要把{}写成\{}。
内容的提问来源于stack exchange,提问作者saadurr
相关产品推荐
相关产品推荐

