首页 > 解决方案 > 我怎样才能将此 egrep 脚本更改为 zgrep 脚本并且仍然可以工作?

问题描述

我正在尝试查找以下任一格式的电话号码:+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

标签: bashgrepzgrep

解决方案


zgrep没有任何选项的正则表达式功能等同于grep; 您需要说明在搜索压缩文件时zgrep -E是否要使用grep -E(又名)正则表达式语法。egrep

#!/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

还要注意为什么要测试“$?” 查看命令是否成功,反模式?以及何时在 shell 变量周围加上引号,以及-q过度重定向到的首选项/dev/null,以及在标准错误(>&2重定向)上显示错误消息。

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

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

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


推荐阅读