AI智能
改变未来

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


  上一节中,我们了解了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@KaliThe excutible files\' extension in windows is .exeI am a enthusiastic man.My Phone number is 13957191293.isn\'t it a good idea?eeeeuuuuuuraaaaa! uuuraaaa!
  1. 匹配手机号

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

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

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

    *
    +

    示例

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

    zheng@Kali:~/temp$ grep \"u*ra*\" aMy 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编程(五):变量(下)变量运算、内容替换、环境变量配置文件

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Linux Bash Shell编程(六):正则表达式 基本元字符应用示例