• 第七章 正则表达式


    目录

    1.1. 概念:

    1.2. 基本正则表达式

    1.2.1. 常见元字符

    1.2.2. POSIX字符类

    1.2.3. 示例

    1.3. 扩展正则表达式

    1.3.1. 概念

    1.3.2. 示例


    1.1. 概念:

    在进行程序设计的过程中,用户会不可避免地遇到处理某些文本的情况。有的时候,用户还需要查找符合某些比较复杂规则的字符串。对于这些情况,如果单纯依靠程序设计语言本身,则往往会使得用户通过复杂的代码来实现。但是,如果使用正则表达式,则会以非常简短的代码来完成

    正则表达式是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的说,正则表达式就是用在字符串的处理上面的一项表示式。由于正则表达式语法简练,功能强大,得到了许多程序设计语言的支持,包括Java、C++、Perl以及Shell等

    1.2. 基本正则表达式

    基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一,另外一种语法标准称为扩展正则表达式

    1.2.1. 常见元字符

    1.2.2. POSIX字符类

    POSIX字符类是一个形如 [:...:] 的特殊元序列(meta sequence),他可以用于匹配特定的字符范围

    1.2.3. 示例

    [ab] : 检索包含a或包含b的行信息,[ ] 中只能表示一个内容

    1. # 检索包含d或者D的行信息
    2. [root@server ~]# grep -n [dD] /etc/passwd
    3. # 检索包含字母o的行信息
    4. [root@server ~]# grep -n [oo] /etc/passwd

    [^ ] : 根据关键字检索后反向显示(反向着色)

    1. # 检索不包含字母o的行信息
    2. [root@server ~]# grep -n [^o] /etc/passwd
    3. # 检索不以r开头且包含oot的行信息
    4. [root@server ~]# grep -n [^r]oot /etc/passwd

    [-] : 表示范围,如:[0-9] [a-z] [A-Z] [a-zA-Z]

    1. # 检索包含7-9的行信息
    2. [root@server ~]# grep -n [7-9] /etc/passwd
    3. # 检索包含大写字母的行信息
    4. [root@server ~]# grep -n [A-Z] /etc/passwd
    5. # 检索包含数字和字母的行信息
    6. [root@server ~]# grep -n [0-9a-zA-Z] /etc/sos/sos.conf
    7. # 上例改写
    8. [root@server ~]# grep -n [[:alnum:]] /etc/sos/sos.conf

    ^行首与$行尾

    1. # 检索root开头的行信息
    2. [root@server ~]# grep -n ^root /etc/passwd
    3. # 检索以#开头的行信息
    4. [root@server ~]# grep -n "^#" /etc/sos/sos.conf
    5. # 检索以"[" 开头的行信息
    6. [root@server ~]# grep -n "^\[" /etc/sos/sos.conf
    7. # 检索以数字结尾的行信息
    8. [root@server ~]# grep -n "[0-9]$" /etc/sos/sos.conf
    9. # 检索空白行
    10. [root@server ~]# grep -n "^$" /etc/sos/sos.conf
    11. # 注意
    12. [root@server ~]# grep -n ^[root] /etc/passwd # 检索以r开头或o开头或t开头,独立对待
    13. [root@server ~]# grep -n ^root /etc/passwd # 检索root开头,整体对待
    14. [root@server ~]# grep -n [^root] /etc/passwd # 检索不包含r或o或t的,反向着色
    15. # 注意:^[] 与 [^] 区别

    点(.) 与星号(*)

    1. # 检索以r开头t结尾中间只有2个字符的行信息
    2. [root@server ~]# grep -n r..t /etc/passwd
    3. # 检索至少包含1个w字母的行信息
    4. [root@server ~]# grep -n ww* /etc/passwd
    5. # 检索至少包含2个字母o的行信息
    6. [root@server ~]# grep -n ooo* /etc/passwd
    7. # 检索包含(.)的行信息
    8. [root@server ~]# grep -n "\." /etc/passwd # 需要加双引号

    1.3. 扩展正则表达式

    1.3.1. 概念

    扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式所支持的元字符并不支持。前面介绍的元字符“^”、“$”、“.”、“*”、“[]”以及“[^]”这6个元字符在扩展正则表达式都得到了支持,并且其意义和用法都完全相同,不再重复介绍。接下来重点介绍一下在扩展正则表达式中新增加的一些元字符。

    1.3.2. 示例

    1. # 显示/etc/passwd 中以bash结尾的行信息
    2. [root@server ~]# grep -n "bash$" /etc/passwd
    3. # 找出/etc/passwd中包含三位数或者四位数的行信息
    4. [root@server ~]# grep -n "\<[0-9]\{3,4\}\>" /etc/passwd
    5. # 上例改写
    6. [root@server ~]# grep -n "\<[[:digit:]]\{3,4\}\>" /etc/passwd
    7. # 检索/etc/grub2.cfg文件中,以至少一个空白字符开头,后面跟上非空白字符的行
    8. [root@server ~]# grep -n "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
    9. # 分析
    10. # ^[[:space:]] :表示以空白字符开头
    11. # \+:grep不支持扩展正则的元字符,需要转义
    12. # [^[:space:]]:不包含非空白字符
    13. # grep可以使用-E参数启用扩展正则,命令改为:
    14. [root@server ~]# grep -nE "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
    15. # 也可以使用egrep,其支持扩展正则,命令改为
    16. [root@server ~]# egrep -n "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
    17. # 检索netstat -tan 命令的运行结果中,以“LISTEN”后跟上0个或多个空白字
    18. 符结尾的行信息
    19. [root@server ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
    20. # *$表示重复前面0次或多次,$为结尾
    21. # 检索fdisk -l 命令结果中,包含以/dev/开头后跟上n的行信息
    22. [root@server ~]# fdisk -l | grep "^/dev/n"
    23. # 检索 ldd /usr/bin/cat 命令结果中的文件路径
    24. [root@server ~]# ldd /usr/bin/cat | grep -oE "/[^[:space:]]+"
    25. # -o:只显示检索命中的标红内容
    26. # -E:启用扩展正则
    27. # 检索/proc/meminfo文件中,所有以大写A或大写S开头的行信息
    28. [root@server ~]# grep -n "^[AS]" /proc/meminfo
    29. # 显示/etc/passwd文件中当root、sshd、chrony的相关信息
    30. [root@server ~]# egrep -n "(root|sshd|chrony)" /etc/passwd
    31. # 需要使用egrep,其支持扩展正则
    32. # (|) 会对|左右两边的整体内容进行匹配
    33. # echo输出一个绝对路径,使用egrep取出其基名
    34. [root@server ~]# echo /etc/yum.repos.d/ | egrep -o [^/]+/?$
    35. # 检索ifconfig命令结果的1-255之间的整数
    36. [root@server ~]# ifconfig | egrep -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

  • 相关阅读:
    第1章 数据结构绪论
    床旁婴儿床上架亚马逊美国站 ASTM F2906测试的重要性
    $.ajax() 方法案例
    YOLOv8改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FoucsIoU等损失函数
    【数据结构】栈和队列
    考 PMP 证书真有用吗?
    计算机视觉图像处理面试笔试题整理——形态学处理
    基于yolov5的交通标志牌的目标检测研究设计——思路及概念
    如何编写有效的接口测试
    Spark 单机和集群环境部署教程
  • 原文地址:https://blog.csdn.net/m2282475145/article/details/136259491