[转帖] 这grep咋还不支持\d呢(BRE,ERE,PCRE)
https://www.cnblogs.com/codelogs/p/16060372.html
简介#
对于刚使用Linux不久的同学,肯定会遇到这个问题,就是用grep匹配数字时,发现\d匹配不了数字。
主要原因是grep支持三种正则表达式BRE,ERE,PCRE,而其默认使用的是BRE,但\d是定义在PCRE中的,所以grep默认是不支持\d的。
正则表达式分类#
BRE
基本的正则表达式(Basic Regular Expression 简称 BRE),由posix标准定义,为了统一历史上混乱的正则实现。
ERE
扩展的正则表达式(Extended Regular Expression 简称 ERE),由posix标准定义,解决了一些BRE的缺陷并补充了一些新功能。
PCRE
Perl兼容的正则表达式(Perl Compatible Regular Expression 简称 PCRE),由perl语言发展而来,而后移植到各平台与编程语言中,所以称其为Perl兼容的正则表达式。
如今主流编程语言(java,python)中的正则实现,基本都是PCRE,PCRE功能也比BRE,ERE要强大得多,虽然大部分同学只知道其基础部分。
BRE,ERE,PCRE对比#
| 功能 | 描述 | BRE | ERE | PCRE |
|---|---|---|---|---|
| 字符组 | 匹配指定任一字符 | [..] |
[..] |
[..] |
| 排除字符组 | 匹配非指定任一字符 | [^..] |
[^..] |
[^..] |
| 简写字符组.号 | 匹配非换行字符 | . |
. |
. |
| 简写字符组 | 匹配数字 匹配非数字 |
不支持 | 不支持 | \d \D |
| 简写字符组 | 匹配字母数据下划线 匹配非字母数字下划线 |
\w \W |
\w \W |
\w \W |
| 简写字符组 | 匹配空白符 匹配非空白符 |
\s \S |
\s \S |
\s \S |
| 匹配量词 | 匹配0次或多次 | * |
* |
* |
| 匹配量词 | 匹配1次或多次 | \+ |
+ |
+ |
| 匹配量词 | 匹配0次或1次 | \? |
? |
? |
| 匹配量词 | 匹配x次 匹配x次或以上 匹配x次或以上y次或以下 |
\{x\} \{x,\} \{x,y\} |
{x} {x,} {x,y} |
{x} {x,} {x,y} |
| 懒惰匹配量词 | 尽量不匹配 | 不支持 | 不支持 | *? +? ?? {x}? {x,}? {x,y}? |
| 占有匹配量词 | 匹配后就不会回溯 | 不支持 | 不支持 | *+ ++ ?+ {x}+ {x,}+ {x,y}+ |
| 位置限定 | 匹配行开头位置 | ^ |
^ |
^ |
| 位置限定 | 匹配行结尾位置 | $ |
$ |
$ |
| 位置限定 | 匹配单词边界 匹配非单词边界 |
\b \B |
\b \B |
\b \B |
| 多选结构 | 多选匹配条件 | | |
` | ` |
| 捕获组与反向引用 | 分组并捕获 | \(...\) \1 \2 |
(...) \1 \2 |
(...) \1 \2 |
| 仅分组 | 仅分组不捕获括号 | 不支持 | 不支持 | (?:) |
| 固化分组 | 匹配后就不回溯的分组 | 不支持 | 不支持 | (?>) |
| 环视 | 零长度断言 | 不支持 | 不支持 | (?=...) (?!...) (?<=...) (?<!...) |
可以发现BRE与ERE的主要区别是,BRE对于+,?,{x},|,(),需要使用\转义后,才能表达正则的含义,否则视为普通字符,而ERE默认表示正则元字符,加\才是普通字符。
另外,对于我们常用的\d,BRE与ERE都不支持。
命令与它们的正则分类#
grep
对于grep,默认使用BRE,grep -E或egrep使用ERE,实际上grep -E与egrep是等价的,grep -P使用PCRE。
另外,值得一提的是grep -F代表普通字符串匹配,grep -w代表单词模式匹配,如grep -w abc等价于grep '\babc\b',其中\b用于匹配单词边界。
sed
对于sed,默认也使用BRE,sed -E或sed -r使用ERE,sed不支持PCRE。
awk
对于awk来说,默认就是ERE,它不支持BRE与PCRE。
另外,PCRE发布了两个新的轮子pcregrep与pcre2grep,功能上类似于grep,不过是专门用PCRE规范实现的,pcre2grep有个好用的功能,可以很方便的使用正则提取数据,如下:
$ echo -e 'name:zhangsan,age:18 \n name:lisi,age:20' | pcre2grep -O '$1 $2' 'name:(\w+),age:(\d+)'
zhangsan 18
lisi 20
往期内容#
不容易自己琢磨出来的正则表达式用法
原来awk真是神器啊
Linux文本命令技巧(上)
Linux文本命令技巧(下)
字符编码解惑
[转帖] 这grep咋还不支持\d呢(BRE,ERE,PCRE)的更多相关文章
- BAE3.0还不支持本地写入文件
BAE3.0对比2.0做了很大的改动,对于安装应用方面也方便了很多,普通的应用表面上(下文就是讲为什么说表面上)不需要做什么适配.比如wp博客,直接修改wp-config.php,把数据库信息填一下就 ...
- 字符转码开源库libiconv目前还不支持64位
最新版的libiconv 1.14目前还不支持64位系统,只能编译出32位库. libiconv 1.14下载地址: http://ftp.gnu.org/pub/gnu/libiconv/libic ...
- linux(5)--补充(管道| / 重定向> / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)
本节中正则表达式的工具程序 grep,sed和awk是重点,也是难点!!! 先补充一下一. 管道| / 重定向> / xargs 如:1. 管道和重定向的区别:具体可以见 http://www. ...
- [转帖].NET Framework各版本操作系统支持
.NET Framework .NET版本 1.0 1.1 2.0 3.0 3.5 4.0 4.5 完整版本 1.0.3705.0 1.1.4322.573 2.0.50727.42 3.0.4506 ...
- [转帖]订购微软Windows 7延长支持服务的报价曝光 第三年要价两百美金
订购微软Windows 7延长支持服务的报价曝光 第三年要价两百美金 cnbeta 年2月份的新闻 https://www.cnbeta.com/articles/tech/815885.htm 微软 ...
- jsp页面实现上传文件,并且还得支持断点续传的功能
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- Java前端Rsa公钥加密,后端Rsa私钥解密(目前还不支持中文加密解密,其他都行)
Base64工具类,可以让rsa编码的乱码变成一串字符序列 package com.utils; import java.io.ByteArrayInputStream; import java.io ...
- [转帖].net 4.8 将不再支持win7 win8 版本
ZT:https://blogs.msdn.microsoft.com/dotnet/2018/07/18/announcing-net-framework-4-8-early-access-buil ...
- 【推荐】CentOS安装Subversion-1.8.11+HTTP协议支持配置
注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. 我们需要搭建一个自己的SVN服务器. 此外,搭建好的SVN服务器除了需要支持svn协议外,最好还需要支持HTTP协议和HTTPS协 ...
- linux管道命令grep命令参数及用法详解---附使用案例|grep
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
随机推荐
- 技术实践丨PostgreSQL开启Huge Page场景分析
PostgreSQL用户经常发现,服务端在连接数较大的情况下,会出现系统内存消耗过多的情况,严重者可能会造成OOM.但是服务端配置的共享内存(shared_buffers,wal_buffers等)是 ...
- 教你如何在Python中读,写和解析CSV文
摘要:在这篇文章中关于"在Python如何阅读CSV文件"中,我们将学习如何读,写和解析的CSV文件的Python. 您知道将表格数据存储到纯文本文件背后的机制是什么吗?答案是CS ...
- 知识+AI融合创新探索,华为云论文被AI顶级学术期刊IEEE TPAMI接受
摘要:通过利用物体类别之间存在的层级关系约束,自动学习从数据中抽取识别不同类别的规则,一方面对模型的预测过程进行解释,另一方面也提供了一条引入人工先验知识的可行途径. 前言 受益于深度学习技术的突破, ...
- 带你探索CPU调度的奥秘
摘要:本文将会从最基础的调度算法说起,逐个分析各种主流调度算法的原理,带大家一起探索CPU调度的奥秘. 本文分享自华为云社区<探索CPU的调度原理>,作者:元闰子. 前言 软件工程师们总习 ...
- 实践解析可视化开发平台FlinkSever优势
摘要:华为Flink可视化开发平台FlinkServer作为自研服务,能够提供比原生flinksql接口更强的企业级特性,比如任务的集中管理,可视化开发,多数据源配置等. 本文分享自华为云社区< ...
- storybook添加全局样式与sass全局变量设置
storybook组件需要全局样式,只需在.storybook/preview.js 增加全局样式即可. import '../src/style/index.scss'; export const ...
- 在Flutter中使用SetState无效?可能是忽略了这个!
这次是Flutter开发技术分享,解决的问题点来自本人实际的开发经历. 首先描述一下问题:在某个组件中调用setState()方法更新该组件状态,结果是无法做到更新效果,组件仍然维持原状. 下面我们用 ...
- 【论文笔记#1】SPGAN-DA:用于领域自适应遥感图像语义分割的语义保留生成对抗网络
作者: Yansheng Li 发表年代: 2023 使用的方法: 无监督领域自适应(UDA).GAN.ClassMix.边界增强 来源: IEEE TGRS 方向: 语义分割 期刊层次: CCF B ...
- 台大李宏毅机器学习公开课2020版登陆B站
课程简介: 真正大师的课程往往都是免费的,诸如吴恩达,李飞飞等.不过大家应该对李宏毅老师也不陌生吧?很多机器学习初学者,首选李宏毅老师.毕竟中文授课,而且他讲课通俗易懂.课程案例生动有趣(还记得宝可梦 ...
- 【django-vue】 项目上线 uuid重复问题 内网穿透 支付宝验签 nginx集群 远程连接redis 使用uwsgi启动django
目录 上节回顾 uuid重复问题 内网穿透 支付宝验签 今日内容 1 上线架构图 2 阿里云购买 3 安装git和其他依赖 4 云服务器安装mysql 5 云服务器安装redis(源码安装) 远程连接 ...