当前位置: 首页 > article >正文

Shell正则表达式

基本正则列表

正则符号描述
^匹配行首
$匹配行尾
[]集合,匹配集合中的任意单个字符
[^]对集合取反
.匹配任意单个字符
*匹配前一个字符任意次数 [*不允许单独使用]
\{n,m\}匹配前一个字符n到m次
\{n\}匹配前一个字符n次
\{n,\}匹配前一个字符n次及以上
\(\)组合为整体,保留

扩展正则列表

正则符号描述
+最少匹配一次
最多匹配一次
{n,m}匹配前一个字符n到m次
()组合为整体,保留
|或者
\b单词边界

步骤

1)基本正则表达式
[root@sv7 ~]# cp /etc/passwd user  #准备素材

测试 ^  $  []  [^]
[root@sv7 ~]# grep root user        #查找root相关的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@sv7 ~]# grep ^root user       #找以root开头的行
root:x:0:0:root:/root:/bin/bash

[root@sv7 ~]# grep bash$ user       #找以bash结尾的行
root:x:0:0:root:/root:/bin/bash
alice:x:1001:1001::/home/alice:/bin/bash
jim:x:1002:1002::/home/jim:/bin/bash
...

[root@sv7 ~]# grep ^$ user         #找空行
[root@sv7 ~]# grep -v ^$ user      #取反,显示除了空行的内容
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...

[root@sv7 ~]# grep "[root]" user      #找r、o、t任意一个字符 
[root@sv7 ~]# grep "[rot]" user       #效果同上
[root@sv7 ~]# grep "[^rot]" user      #对集合取反,显示r或o或t以外的内容

[root@sv7 ~]# grep "[0123456789]" user   #找所有数字
[root@sv7 ~]# grep "[0-9]" user       #效果同上
[root@sv7 ~]# grep "[^0-9]" user      #显示数字以外内容

[root@sv7 ~]# grep "[a-z]" user       #找所有小写字母
[root@sv7 ~]# grep "[A-Z]" user       #找所有大写字母
[root@sv7 ~]# grep "[a-Z]" user       #找所有字母
[root@sv7 ~]# grep "[^0-9a-Z]" user     #找所有符号

 

测试 .  *
[root@sv7 ~]# grep "." user         #找任意单个字符,文档中每个字符都可以理解为任意字符
[root@sv7 ~]# grep "r..t" user      #找rt之间有2个任意字符的行
[root@sv7 ~]# grep "r.t" user       #找rt之间有1个任意字符的行,有匹配就输出;没有匹配就无输出
[root@sv7 ~]# grep "*" user         #错误用法,*号是匹配前一个字符任意次,不能单独使用
[root@sv7 ~]# grep "a*" user        #此时看到的结果是带a的已经匹配出来,但是仔细看结果发现没有a的行也匹配出来了。这是因为a匹配前一个字符任意次(包括0次,a不出现也行),如果想要解决这问题,可以匹配时再加一个a,如 grep "aa*" user(第一个a必须出现,第二个a匹配可以没有,也可以有)
[root@sv7 ~]# grep "ro*t" user       #找rt,中间的o有没有都行,有几次都行
[root@sv7 ~]# grep ".*" user        #找任意,包括空行 .与*的组合在正则中相当于通配符的效果

测试  \{n\}  \{n,\}  \{n,m\}  \(\)
[root@sv7 ~]# grep "o\{1,2\}" user              #找o,可以匹配1~2次
[root@sv7 ~]# echo rooooot | grep "o\{3,\}"     #找o,可以匹配3个以及以上,都会匹配
[root@sv7 ~]# echo rooooot | grep "o\{3\}"      #找o,只匹配3个

[root@sv7 ~]# echo ababab | grep "\(ab\)\{3,5\}"    #匹配ab 3~5次,小括号的作用是将字符组合为一个整体
ababab  

2)扩展正则表达式,以上命令均可以加-E选项并且去掉所有\,-E使用扩展正则的用法
[root@sv7 ~]# grep a+ user          #使用扩展正则没反应
[root@sv7 ~]# grep -E a+ user       #-E选项使用扩展正则,有结果显示,最少匹配a一次,上不封顶
[root@sv7 ~]# egrep a+ user         #使用扩展正则

[root@sv7 ~]# echo ababab | grep "\(ab\)\{3,5\}"    #匹配ab 3~5次,小括号的作用是将字符组合为一个整体
ababab  
可以简写为以下步骤
[root@sv7 ~]# echo ababab | grep -E "(ab){3,5}"
ababab

测试 | 或者的意思
[root@sv7 ~]# echo abcdef | grep -E "(ab|ef)"    #找ab或者ef
abcdef

测试\b 单词边界
[root@sv7 ~]# echo iwanttheapple | grep "the"   #可以过滤出the
iwangttheapple
[root@sv7 ~]# echo iwanttheapple | grep -E "\bthe"  #结果the不出来,the前面不能有内容,需要是一个独立的the才能出来

[root@sv7 ~]# echo iwant theapple | grep -E "\bthe" #字符串the前面加空格
iwant theapple
[root@sv7 ~]# echo iwant theapple | grep -E "\bthe\b"   #后面加\b结果也是出不来,the后面也能不能有内容
[root@sv7 ~]# echo iwant the apple | grep -E "\bthe\b"  #the后面加空格,才能出来
iwant the apple


http://www.kler.cn/a/598576.html

相关文章:

  • fastapi+playwright爬取google搜索1-3页的关键词返回json
  • 《Solidity智能合约开发:从零到一实战指南》大纲
  • SpringBoot 第三课(Ⅰ) 数据层开发
  • Simple-BEV的bilinear_sample 作为view_transformer的解析,核心是3D-2D关联点生成
  • 8、undo log
  • 使用HAI来打通DeepSeek的任督二脉
  • 我的uniapp自定义模板
  • 基于AT89C52单片机的智能家居安全监控系统设计
  • 【RabbitMQ】RabbitMQ消息的重复消费问题如何解决?
  • 编译安装redis,systemtcl配置redis自启动,系统并发调优
  • IMX8MP Android 10系统编译SDK
  • elasticsearch+sentencetransformer检索样例
  • 开源链动2+1模式、AI智能名片与S2B2C商城小程序源码在社交电商渠道拓宽中的协同应用研究
  • 石家庄 10 年 PHP 开发者转岗分析
  • Python 用户账户(让用户拥有自己的数据)
  • Java EE(13)——网络编程——UDP/TCP回显服务器
  • 【系统架构设计师】调用/返回体系结构风格
  • 如何在 Linux 中递归解压所有子目录下的 `.tar.gz` 文件
  • 前端面试:[React] scheduler 调度机制原理?
  • -PHP 应用文件管理模块包含上传遍历写入删除下载安全