我怎样才能将这个 egrep 脚本更改为 zgrep 脚本并且仍然可以正常工作?

How could I change this egrep script to a zgrep script and still have it work?

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

代码:

#!/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  ; else echo "No matches found" ; fi 2>/dev/null
没有任何选项的

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 ""
else
    echo "No matches found" >&2
fi

还请注意 and When to wrap quotes around a shell variable 以及 -q 优先于重定向到 /dev/null,以及在标准错误(>&2 重定向)时显示错误消息。

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

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

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