• 9、正则表达式入门



    尚硅谷2022版Linux扩展篇Shell教程-讲师:武晟然

    壁立千仞 无欲则刚

    9、正则表达式入门

    正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。

    在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

    在 Linux 中,grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配。

    9.1 常规匹配

    一串不包含特殊字符的正则表达式匹配它自己,例如:

    [root@centos7-101 archive]# cat /etc/passwd | grep qiqi
    qiqi:x:1002:1002::/home/qiqi:/bin/bash
    
    • 1
    • 2

    就会匹配所有包含 qiqi 的行。

    9.2 常用特殊字符

    1)特殊字符:^

    ^ 匹配一行的开头,例如:

    # 会匹配出所有以 a 开头的行
    [root@centos7-101 archive]# cat /etc/passwd | grep ^a
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    abrt:x:173:173::/etc/abrt:/sbin/nologin
    avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    
    # 会匹配出所有以 av 开头的行
    [root@centos7-101 archive]# cat /etc/passwd | grep ^av
    avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2)特殊字符:$

    $ 匹配一行的结束,例如

    [root@centos7-101 network-scripts]# cat /etc/passwd | grep t$
    halt:x:7:0:halt:/sbin:/sbin/halt
    
    • 1
    • 2

    思考:^$ 匹配什么?
    如果指定开头指定结尾,那就必须这一行和规定的一样,不然就匹配不到

    [root@centos7-101 scripts]# cat daily_archive.sh | grep -n ^$
    8:
    21:
    24:
    28:
    30:
    32:
    37:
    39:
    # 匹配全是空行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3)特殊字符:.

    . 匹配一个任意的字符,例如

    [root@centos7-101 scripts]# cat daily_archive.sh | grep r..t
    DEST=/root/archive/$FILE
    if [ ! -d /root/archive  ]
    	mkdir /root/archive
    
    • 1
    • 2
    • 3
    • 4

    匹配r与t之间有两个字母的行

    会匹配包含 rabt,rbbt,rxdt,root 等的所有行

    4)特殊字符:*

    * 不单独使用,他和上一个字符连用,表示匹配上一个字符 0 次或多次,例如

    [root@centos7-101 scripts]# cat daily_archive.sh | grep ro*t
    DEST=/root/archive/$FILE
    if [ ! -d /root/archive  ]
    	mkdir /root/archive
    
    • 1
    • 2
    • 3
    • 4

    会匹配 rt, rot, root, rooot, roooot 等所有行
    思考:.* 匹配什么?

    任意字符出现任意多次

    5)字符区间(中括号):[ ]

    [ ] 表示匹配某个范围内的一个字符,例如
    [6,8]------匹配 6 或者 8
    [0-9]------匹配一个 0-9 的数字
    [0-9]*------匹配任意长度的数字字符串
    [a-z]------匹配一个 a-z 之间的字符
    [a-z]* ------匹配任意长度的字母字符串
    [a-c, e-f]-匹配 a-c 或者 e-f 之间的任意字符

    [root@centos7-101 scripts]# cat daily_archive.sh | grep r[o]*t
    DEST=/root/archive/$FILE
    if [ ! -d /root/archive  ]
    	mkdir /root/archive
    [root@centos7-101 scripts]# cat daily_archive.sh | grep r[o]*t
    DEST=/root/archive/$FILE
    if [ ! -d /root/archive  ]
    	mkdir /root/archive
    [root@centos7-101 scripts]# cat daily_archive.sh | grep r[a-z]*t
    DEST=/root/archive/$FILE
    if [ ! -d /root/archive  ]
    	mkdir /root/archive
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    6)特殊字符:\

    \ 表示转义,并不会单独使用。

    由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 ‘$’ 的行),就会碰到困难。

    转义字符在使用时,必须用 单引号引起来

    此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如

    [root@centos7-101 scripts]# cat daily_archive.sh | grep '\$'
    if [ $# -ne 1 ]
    if [ -d $1 ]
    DIR_NAME=$(basename $1)
    DIR_PATH=$(cd $(dirname $1); pwd)
    DATE=$(date +%y%m%d)
    FILE=archive_${DIR_NAME}_${DATE}.tar.gz
    DEST=/root/archive/$FILE
    tar -czf $DEST $DIR_PATH/$DIR_NAME
    if [ $? -eq 0 ]
    	echo "归档文件为:$DEST"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    就会匹配所有包含 a$b 的行。注意需要使用单引号将表达式引起来

    7)正则的扩展规则

    在一些工具中不太支持

    例如:
    a{2}:a出现两次
    +:1次或多次
    ?:0次或1次

    8)正则匹配手机号合法性
    条件:
    11位
    以1xx开头

    [root@centos7-101 scripts]# echo "16612341234" | grep ^1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$
    16612341234
    
    • 1
    • 2

    加-E支持扩展正则表达式

    [root@centos7-101 scripts]# echo "16612341234" | grep -E ^1[0-9][0-9]{9}$
    16612341234
    
    • 1
    • 2
  • 相关阅读:
    时序动作定位 | ActionFormer: 使用Transformers动作时刻
    Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。
    java里面获取map的key和value的方法
    贴纸拼词 —— 记忆化搜索 / 状压DP
    stm32之手动创建keil工程--HAL库
    基于微信小程序的线上课堂系统
    酷开科技打造更好体验服务用户
    Kubernetes 使用 PVC 持久卷后,持久卷内数据丢失问题
    【大数据面试题】014 Flink CDC 用过吗,请简要描述
    LeetCode 92. Reverse Linked List II【链表,头插法】中等
  • 原文地址:https://blog.csdn.net/zhao854116434/article/details/128125606