【问题标题】:How could I change this egrep script to a zgrep script and still have it work?我怎样才能将此 egrep 脚本更改为 zgrep 脚本并且仍然可以工作?
【发布时间】:2021-03-04 04:35:27
【问题描述】:

我正在尝试查找以下任一格式的电话号码:+1.570.555.1212、570.555.1212、(570)555-1212 和 570-555-1212。我们还需要使用 zgrep 查看压缩文件夹,但是我会让我的代码返回“未找到匹配项”。该代码如下所示,可以从 txt 文件中查找电话号码。这很糟糕,但它在下面

代码:

#!/bin/bash
egrep '[0-9]{3}-[0-9]{3}-[0-9]{4}|[0-9]{3}.[0-9]{3}.[0-9]{4}|([0-9]{3})[0-9]{3}-[0-9]{4}|+(1).[0-9]{3}.[0-9]{3}.[0-9]{4}' *
if [ $? -eq 0 ] ; then echo $1 ; else echo "No matches found" ; fi 2>/dev/null

【问题讨论】:

    标签: bash grep zgrep


    【解决方案1】:

    zgrep 没有任何选项在其正则表达式功能上等同于grep;如果你想在搜索压缩文件时使用grep -E(又名egrep)正则表达式语法,你需要说zgrep -E

    #!/bin/bash
    if zgrep -E -q '[0-9]{3}-[0-9]{3}-[0-9]{4}|[0-9]{3}.[0-9]{3}.[0-9]{4}|([0-9]{3})[0-9]{3}-[0-9]{4}|+(1).[0-9]{3}.[0-9]{3}.[0-9]{4}' *
    then
        echo "$1"
    else
        echo "No matches found" >&2
    fi
    

    还要注意Why is testing “$?” to see if a command succeeded or not, an anti-pattern?When to wrap quotes around a shell variable 以及-q 优先于重定向到/dev/null,以及在标准错误(>&2 重定向)上显示错误消息。

    您的正则表达式也可以使用一些重构;可以试试

    (\+\(1\).)?[0-9]{3}.[0-9]{3}.[0-9]{4}
    

    注意圆括号和加号需要反斜杠转义以匹配字面意思,以及在将 +(1) 前缀重构为可选后,正则表达式的其余部分如何包含您枚举的所有其他变体,因为 @987654334 @ 匹配 -(. 以及许多其他字符。 (可选前缀也可以完全删除,这仍然会匹配相同的字符串,但我不得不猜测一些事情,所以我把它留在这个备注中。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 2021-01-30
      • 1970-01-01
      • 2021-11-03
      • 2011-08-28
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多