【问题标题】:awk Regular Expression (REGEX) get phone number from fileawk 正则表达式 (REGEX) 从文件中获取电话号码
【发布时间】:2020-08-29 01:18:29
【问题描述】:

以下是我写的,允许我只显示电话号码 在文件中。我也在下面发布了示例数据。

据我了解(从左到右阅读): 如果第一个字符是一个 Int,然后是一个以 [-,:] 开头的 int,然后是一个以 [-,:] 开头的 int,则使用由 "," 分隔的 awk 命令。显示第 3 列。

我使用“www.regexpal.com”来验证我的表达。我想了解更多,而不仅仅是答案,一个解释会很好。

GNU bash,版本 4.4.12(1)-release (x86_64-pc-linux-gnu)

awk -F "," '/^(\d)+([-,:*]\d+)+([-,:*]\d+)*$/ {print $3}' bashuser.csv

bashuser.csv
Jordon,New York,630-150,7234
Jaremy,New York,630-250-7768
Jordon,New York,630*150*7745
Jaremy,New York,630-150-7432
Jordon,New York,630-230,7790

Expected Output:
6301507234
6302507768
....

【问题讨论】:

  • \dPCRE,试试[0-9]+[[:digit:]]+
  • int 或整数通常是原始数据类型。这意味着它们的大小是有限的。正则表达式的 \d 指的是一个数字。这是 '0' 和 '9' 之间的值的字符
  • 输第一个^
  • 感谢大家提供的信息。我添加了一个预期的输出来看看你将如何解决这个问题。

标签: regex bash csv awk


【解决方案1】:

你可以删除所有非 int

awk '{gsub(/[^[:digit:]]/, "")}1' file.csv 
  • gsub删除所有匹配项
  • [^[:digit:]] ^ 除了它旁边的东西,这是一个 int [[:digit:]],如果你删除 ^,就会发生相反的情况。

  • "" 表示在 gsub 语句内的 awk 中删除或删除。

  • 1表示全部打印,print的快捷方式

sed

sed 's/[^[:digit:]]*//g' file.csv 

【讨论】:

    【解决方案2】:

    由于您想要的输出总是从字段 #3 开始,您可以使用以下方法大大简化您的正则表达式:

    awk -F '[*,-]' '{print $3$4$5}'

    概念证明

    $ awk -F '[*,-]' '{print $3$4$5}' < ./bashuser.csv
    6301507234
    6302507768
    6301507745
    6301507432
    6302307790
    

    说明

    • -F '[*,-]':使用字符类将字段分隔符设置为* OR , OR -
    • print $3$4$5:连接第 3 到第 5 个字段。

    【讨论】:

      【解决方案3】:

      awk 不是很合适,因为逗号不仅作为记录的分隔符出现,更好的结果将给出sed

      sed 's/[^,]\+,[^,]\+,//;s/[^0-9]//g;' bashuser.csv
      
      • 第一部分 s/[^,]\+,[^,]\+,// 删除前两条记录
      • 第二部分//;s/[^0-9]//g 删除所有剩余的非数字字符

      【讨论】:

        猜你喜欢
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 2014-01-27
        • 2023-03-15
        • 1970-01-01
        • 2017-09-23
        • 2014-02-15
        相关资源
        最近更新 更多