bash - 我怎样才能将此 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
解决方案
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.
和许多其他字符。(可选前缀也可以完全删除,这仍然会匹配相同的字符串,但我不得不猜测一些事情,所以我把它留在了这个评论中。)
推荐阅读
- php - 删除 woocommerce 安装的签出阶段
- c# - 如何捕获可能的错误消息并将其转移到甜蜜警报
- android - 切换蓝牙 UUID 的字节序时尝试将 ByteByffer 转回 byteArray 时出错
- xamarin.ios - 如果在 cfbundlelocalizations 中找不到语言键,如何设置默认语言
- c# - 如何在不注销的情况下检查母版页上的会话空值
- objective-c - 按下键盘上的向下箭头会调用哪个代表?
- css - 适用于 iPad Pro 12.9 第三代的 CSS 媒体查询
- node.js - 如何对在单独方法中调用的 AWS 开发工具包方法进行单元测试?
- ruby-on-rails - ActiveRecord 与两个不同模型的关联
- c - c语言中常数E有什么作用