您的位置:首页 > 运维架构 > Shell

Linux Bash Shell编程(六):正则表达式 基本元字符应用示例

2020-08-13 23:23 1111 查看

  上一节中,我们了解了Bash Shell中的变量计算、变量内容替换和环境变量配置文件相关内容。在了解了变量及其相关运算/操作后,本节开始,我们将一起了解Shell中的字符串处理方面内容,由于Bash的部分命令支持正则表达式,我们也将一并了解正则表达式的基础用法

正则表达式简介

  正则表达式是一种字符串匹配模式,用来在文件中匹配符合条件的字符串,正则是包含匹配(文件行中包含条件就匹配),可以用正则表达式匹配更复杂的要求。

grep
awk
sed
命令支持正则表达式。

  而同样在Shell中使用的通配符则用来匹配符合条件的文件名,是完全匹配,

ls
find
cp
不支持正则表达式,仅能使用通配符,通配符的匹配条件较为简单 。

基础正则表达式元字符

元字符 作用
* 前一个字符匹配0次或任意多次
\+ 前一个字符匹配1次或任意多次
. 匹配除了换行符以外任意一个字符
^ 匹配行首。匹配以后面的文字开头的行
$ 匹配行尾,即以后面的文字结尾的行
[] 匹配括号中指定的任何一个字符(仅一个),同通配符
[^] 取反, 匹配除括号中字符以外的任意一个字符,同通配符
\ 转义符,取消特殊符号的含义
\{n\} 表示其前面的字符恰好出现n次
\{n,\} 表示其前面的字符出现不小于n次
\{n,m\} 表示其前面的字符至少出现n次,最多出现m次。

元字符用法及注意事项

  • 对于

    *
    \+
    两个元字符(例如
    "a*"
    ),若独立作为匹配条件没有意义,由于包含匹配特性,可以有如
    "aa*"
    "a"
    代替的简便方式,该元字符一般用于词内部的单个字符重复情况。例如,

    要匹配类似于"uuuuuuuraaaaa"(

    u
    a
    数量未知)的单词,可以使用
    "u*ra*"
    的匹配条件

  • 行首元字符必须在第一位,例如

    "^abc"
    ;行尾元字符必须在最后一位,例如
    "abc$"

  • .
    相当于通配符中的
    ?
    ,可以匹配任意字符,包括空字符

  • 方括号类元字符中可以使用枚举型集合,也可以使用区间首尾用减号

    -
    连接,比如匹配所有小写字母使用
    "[a-z]"
    ,匹配非数字字符用
    "[^0-9]"
    。仅针对一个字符

  • 花括号(无论左右)的左边必须有转义符

    \

  • 关于花括号元字符:不是匹配在一行中出现该字符的个数,而是连续出现该字符的个数,独立作为匹配条件时设定最大值无意义,仍可以认为该行中包含了不超过最大值次重复的字符

正则表达式应用场景

支持正则表达式的命令有很多,下面选取比较常用的字符串搜索命令

grep
进行样例示范

#grep命令语法
grep [mode] [options] <pattern> <filename>
#描述模式的匹配类型 模式 文件名
  • 模式的匹配类型
模式类型 作用
-E 扩展正则表达式
-F 字符串
-G 基本正则表达式(默认模式类型)
-P Perl正则表达式
  • grep
    命令常见选项
选项 说明
-n 显示匹配行的同时显示行号
-b 显示字节偏移(第几个字符)
-i 在匹配时忽略大小写
-v 匹配条件取反,显示不匹配该条件的行
  • 匹配模式即为匹配条件,符合条件的行将被筛选显示
  • grep
    命令同样支持管道符(常用)和控制台输入,控制台输入结束以
    ctrl
    +
    d
    结束(可多行,故不能以
    enter
    结束)
  • 匹配模式要用双引号
    ""
    包含,否则搜索输出结果可能产生错误

正则表达式示例

首先创建一个带有部分素材的文件,随个人喜好编辑

#以下内容存储在测试素材文件a中
Hello!
I am Zheng@Kali
The excutible files' extension in windows is .exe
I am a enthusiastic man.
My Phone number is 13957191293.
isn't it a good idea?
eeee
uuuuuuraaaaa! uuuraaaa!
  1. 匹配手机号

    手机号的第一位一般为1,第二位一般为3-8,后九位任意

zheng@Kali:~/temp$ grep "1[3-8][0-9]\{9\}" a
My Phone number is 13957191293.
#匹配模式一定要用""包含
  1. 找出以 i 开头的行

    grep "^i" a
    isn't it a good idea?
    
    grep -i "^i" a  #使用忽略大小写选项
    I am Zheng@Kali
    I am a enthusiastic man.
    isn't it a good idea?
  2. 元字符

    *
    +
    示例

    示例内容同用法及注意事项

    zheng@Kali:~/temp$ grep "u*ra*" a
    My Phone number is 13957191293.
    uuuuuuraaaaa! uuuraaaa!
    
    zheng@Kali:~/temp$ grep "u*ra\+" a #使用 + 元字符一定要使用转义符,否则相当于直接匹配加号
    uuuuuuraaaaa! uuuraaaa!

    注意:上示例中u与a没有出现的情况,若行中不出现匹配模式中的字符, 仍然能匹配,而 + 不能匹配*

下一节,Linux Bash Shell编程(七):字符串截取与处理(cut、printf、awk、sed)我们将学习bash中的字符串截取、输出与处理命令
上一节,Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: