shell脚本——正则表达式
什么是正则表达式
正则表达式分为基础正则和扩展正则,都是为了匹配符合预期要求的字符串
正则表达式与通配符的区别
只需要记住,对文件内容或是展示文本的操作都是正则,而对目录或文件名的操作则都是通配符(例如find指令)
基础正则和扩展正则
扩展正则包含基础正则,而且多出了 + ? | ()四个指令(注意这里的 | 要和管道符分开)
扩展正则不需要像基础正则一样对某些符号进行转义(一般是用 反斜杠 \ 来进行)
基础正则表达式符号
符号 | 描述 | 实例 |
. | 代表单个字符(必须存在) |
a..b 可以表示acdb aaab 、abbbb 但不可以表示acb、ab、aba等 |
* |
要和通配符区分开,匹配 * 前面一个字符的0个或多个 *后面的字符一定要在*前面字符的后面 另外*前后字符必须相邻否则匹配不到 |
a*b 可以表示ab、aab、b、abababab 但不可以表示acb、ba等 acb只会匹配到b,也就是视为b前面有0个a ba也只会匹配到b,同样视为b前面有0个a |
^ | 匹配 ^ 后面字符串开头 |
输入:echo -e abcd\accc | grep "^ab" 输出:abcd |
$ | 匹配 $ 前面字符串结尾 |
输入:echo -e abcd\accc | grep "cc$" 输出:accc |
.* | 匹配任意个字符(0到多个) |
a.*b 和通配符里面的 * 大致类似 可以代表ab、 acb、 a……b 但不能代表b……a |
[] |
表示范围,可以用来进行模糊匹配 常用选项为【a-z】 【0-9】 |
1. grep【0-9】 text 过滤出含数字的行 2. grep【a-z】 text 过滤出含小写字母的行 3. grep 【abc】 text 过滤出含有a,b,c的行(注意这个abc是分别匹配,也就是相当于匹配含有a的行,b的行,c的行,并不是字符串abc的行) |
{} |
{n,m}表示匹配 {} 前面字符的至少n个,最多m个 字符,注意:是连在一起的连续字符 还可以为{n,}表示至少有n个 {,m}表示最多有m个 |
1.输入echo abbcdfbjk | grep -E "b{1,2}" 输出 abbcdfbjk 2. 如果 输入 echo abbcdfbjk | grep -E "b{2,}" #表示至少两个 输出结果为 abbcdfbjk 可以看到只有连在一起的两个bb被匹配到,也就是说明了{}里面的数字表示的不是匹配到的个数,而是匹配字符的长度,像这个例子就是要求出现 b 的长度至少是2,所以只有 bb 被匹配到了 3. 输入 grep -E "ac{2,5}b" 匹配a和b之间至少2个最多5个c的行,但是acb要连在一起 |
【^】 | 【^a】表示匹配 a 以外的所有字符 |
输入 echo -e abc \ def \ lmn | grep "[^f-z]" 输出 abc def lmn,只有[a-e]配匹配到 |
^[^] | 匹配 ^[^a]中的以a为开头以外的所有行 | grep "^[^#]" /etc/passwd 匹配 /etc/passwd 里面不以#开头的所有行 |
\< ; \> |
锚定 单词首部 (尾部) 表示在匹配在首部(尾部)以空格或特殊字符为分隔的指定字符。如果同时锚定首尾 \< \> 则表示这个字符的准确匹配,它的前后为特殊字符或空格分隔,不会和任何字符直接连接 注意:必须要加 \ 转义,即使使用扩展正则也要加 \ 进行转义 |
输入 :echo "hi,rootamroot" | grep "\<root" 输入: echo "hiroot iamroot" | grep "root\>" 输入: echo "hi,root iamroot" | grep "\<root\>" |
() |
\1 调用前面的参数—第一个分组(也就是括号里的参数) 如果用扩展正则则不需要 \ 来进行转义 |
过滤出一行中有两个相同数字的行 # grep "\([0-9]\).*\1" /etc/passwd 过滤出行首和行位字母相同的行 # grep "^\([a-z]\).*\1$" /etc/passwd |
最新文章
- 今天思考一个问题,PHP const和static的区别
- 使用NPOI随意创建Excel(含下拉列表)
- SMARTFORM报表程序设计(2)
- JavaScript学习总结【11】、JS 运动
- Leetcode题解(31)
- iOS9中如何在日历App中创建一个任意时间之前开始的提醒(三)
- 【问题】vs IIS破除文件上传限制最全版
- MySQL各版本解释和下载
- Python学习 --- 列表
- ViewPager的addOnPageChangeListener和setOnPageChangeListener的区别,ViewPager改变数据后IndexOutOfBoundsException
- Javassist 字节码 简介 案例 MD
- Android 知识梳理
- C语言qsort用法
- Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) E - Aquarium decoration 贪心 + 平衡树
- rman的基于窗口的备份保留策略学习
- 团队Alpha冲刺(十)
- Go语言【第一篇】:Go初识
- 基本的Ceph性能测试工具和方法
- mysql5.7.22 zip 版安装
- Oracle 常用
热门文章
- [LeetCode] 3.Longest Substring Without Repeating Characters 最长无重复子串
- [LeetCode] 388. Longest Absolute File Path 最长的绝对文件路径
- 10分钟弄懂Raft算法
- 湖南省第6届程序大赛 Repairing a Road
- idea2019.2激活码到2020.7.1【已失效】,有另外的
- Docker的基础教程(基于CentOS)
- 百度小程序上传失败 ServerError:30010的原因
- vs中web api程序不包含适合于入口点的静态“Main”方法
- java笔记4
- docker容器与主机之间的文件复制