Bash 正则表达式

首页 / Shell/Bash / Bash 正则表达式

正则表达式是表达文本模式的方法。

元字符

元字符是表示特殊函数的字符,包括以下这些^ $ . [ ] { } - ? * + ( ) | \\。除了元字符,其他字符在正则表达式中,都表示原来的含义。

  • . 匹配任意字符,但不含空字符
  • ^ 匹配文本行开头
  • $ 匹配文本行结尾
$ grep -h '.zip' dirlist*.txt

上面命令在文件中查找包含正则表达式“.zip”的文本行。注意,上面命令不会匹配zip程序,因为zip只有三个字符,而.zip要求四个字符。

$ grep -h '^zip' dirlist*.txt
$ grep -h 'zip$' dirlist*.txt

上面命令分别在文件列表中搜索行首,行尾以及行首和行尾同时包含字符串“zip”(例如,zip 独占一行)的匹配行。 注意正则表达式‘^$’(行首和行尾之间没有字符)会匹配空行。

方括号

方括号之中的字符,表示可以任意匹配其中的一个。

$ grep -h '[bg]zip' dirlist*.txt

上面命令匹配包含字符串“bzip”或者“gzip”的任意行。

注意,元字符放入方括号之中,会失去其特殊含义。但有两种情况除外,^在方括号的开头,表示否定,否则只是一个普通字符,表示原义。

$ grep -h '[^bg]zip' dirlist*.txt

上面命令匹配不以bg开头的zip字符串。注意,上面命令不会匹配zip,因为一个否定的字符集仍然要求存在一个字符。

-在方括号之中表示一个字符区域。

$ grep -h '^[A-Z]' dirlist*.txt

上面命令匹配所有以大写字母开头的文本行。类似的,^[A-Za-z0-9]表示以大写字母、小写字母、数字开头的文本行。

注意,连字号如果不构成一个字符区域,则表示其本来的含义。

$ grep -h '[-AZ]' dirlist*.txt

上面命令匹配包含一个连字符,或一个大写字母“A”,或一个大写字母“Z”的文件名。

预定义字符类

由于locale设置不同,Shell展开正则表达式[A-Z]时,可能不是解释为所有大写字母,而是解释为包括所有字母的字典顺序。

$ ls /usr/sbin/[A-Z]*

上面命令在某些发行版里面,会返回所有大写字母或小写字母开头的文件。

为了避免这个问题,可以使用正则表达式的预定义字符类。

  • [:alnum:] 字母数字字符。在 ASCII 中,等价于:[A-Za-z0-9]
  • [:word:][:alnum:]相同, 但增加了下划线字符。
  • [:alpha:] 字母字符。在 ASCII 中,等价于[A-Za-z]
  • [:blank:] 包含空格和 tab 字符。
  • [:cntrl:] ASCII 的控制码。包含了0到31,和127的 ASCII 字符。
  • [:digit:] 数字0到9
  • [:graph:] 可视字符。在 ASCII 中,它包含33到126的字符。
  • [:lower:] 小写字母。
  • [:punct:] 标点符号字符。
  • [:print:] 可打印的字符。等于[:graph:]中的所有字符,再加上空格字符。
  • [:space:] 空白字符,包括空格,tab,回车,换行,vertical tab, 和 form feed.在 ASCII 中, 等价于[ \t\r\n\v\f]
  • [:upper:] 大写字母。
  • [:xdigit:] 用来表示十六进制数字的字符。在 ASCII 中,等价于[0-9A-Fa-f]
$ ls /usr/sbin/[[:upper:]]*

上面命令返回所有大写字母开头的文件名。

选择

|表示匹配一系列字符串之中的一个。注意与方括号区分,方括号表示匹配一系列字符之中的一个。

$ echo "AAA" | grep -E 'AAA|BBB'
AAA
$ echo "BBB" | grep -E 'AAA|BBB'
BBB
$ echo "CCC" | grep -E 'AAA|BBB'
$

上面代码中,AAA|BBB表示匹配字符串AAA或者是字符串BBBgrep程序使用-E参数,表示按照正则表达式规则匹配。并且,这个正则表达式放在单引号之中,为的是阻止Shell把|解释为管道操作符。

|可以多个连用,也可以与其他正则规则结合使用。

$ echo "AAA" | grep -E 'AAA|BBB|CCC'

$ grep -Eh '^(bz|gz|zip)' dirlist*.txt

量词操作符

量词操作符表示一个元素被匹配的次数。

  • ? 匹配前面的元素出现0次或1次
  • * 匹配前面的元素出现0次或多次
  • + 匹配前面的元素出现1次或多次
  • {n} 匹配前面的元素出现了n
  • {n,m} 匹配前面的元素它至少出现了n次,但是不多于m
  • {n,} 匹配前面的元素至少出现了n
  • {,m} 匹配前面的元素,如果它出现的次数不多于 m 次。

教程来源:网道(WangDoc.com)以及 Github 无私奉献

这一章《Bash 正则表达式》你学到了什么?做站不易,你的分享是对我们最大的支持,感谢!😊

相关文章

从0打造音视频直播系统 -〔李超 - 41讲〕

Netty源码剖析与实战 -〔傅健 - 60讲〕

重学线性代数 -〔朱维刚 - 19讲〕

如何读懂一首诗 -〔王天博 - 29讲〕

Maven 安装因 type=pom 依赖而失败

获取错误类型的参数不是“X”不能分配给 NextJS 的 NextApiRespons...

取消列出 R 中的数据框列表

如何在 rust 嵌套之外获得变量更改?

PHP在同一页面上获取AJAX数据

随着 Safari 中输入文本的变化,输入类型文本下方的 div 上下移...

视频推荐〔Shell/Bash - 20_until循环〕

更多视频 »