新西兰服务器

Shell中正则表达式怎么用


Shell中正则表达式怎么用

发布时间:2021-12-30 18:01:19 来源:高防服务器网 阅读:53 作者:小新 栏目:建站服务器

这篇文章主要介绍Shell中正则表达式怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

正则表达式


    正则表达式:编写处理字符串的程序或网页时,用于描述查找符合某些复杂规则的字符串的工具。换句话说,就是文本规则的代码。
     正则表达式与通配符类似,是一种进行文本匹配的工具,但是它可以更精确的描述匹配需求。常见的支持正则表达式的工具有:匹配文本行的 grep 工具族;改变输入流的 sed 流编辑器;处理字符串的语言 awk、python、perl、Tcl 等;文件查看程序或分页程序 more、page、less 等;文本编辑器 ed、vi、emacs、vim 等。
     正则表达式内部有多种方法嵌入注释,因此它具有自文档化(self-documenting)的能力。
     b 是正则表达式的一个特殊代码(元字符,meta character),代表单词的开头或者结尾,也就是单词的分界处。通常英文的单词是由 空格、标点符号或者换行来分隔的,但是 b 并不匹配它们中的任何一个,只匹配一个“位置” – 这个位置的前一个字符和后一个字符不全是(一个是,一个不是或不存在) w。“.”是另一个元字符,匹配除了换行符以外的任意字符,“*”指定它之前的内容可以连续重复出现任意次。“.*”就表示任意数量的不包含换行的字符。“d”元字符匹配一位数字(0 或者 1 或者 2 ……),d{n}表示“d”必须连续重复匹配 n 次。
     历史上曾经出现过三种 grep,它们都可以用于匹配文本:Grep 是最早的文本匹配程序,使用 POSIX 支持的基本正则表达式(Basic Regular Expression,BRE);Egrep 是扩展的 grep(Extended grep),使用扩展正则表达式(Extended Regular Expression,ERE);Fgrep 是快速 grep(Fast grep),用于匹配固定字符而不是正则表达式。1992 年发布的 POSIX(The Portable Operating System Interface) 标准中,三个版本合而为一。fgrep 和 egrep 可以在所有 UNIX/Linux 系统上使用,但是被标记为 deprecated(不推荐)。
     从最基本的角度将,正则中有元字符(特殊字符)和一般字符匹配这两种基本字符匹配。一般字符指没有任何特殊意义的字符,而元字符则被赋予了某些特殊含义。

     POSIX 标准中 BRE 和 ERE 支持的 meta 字符有相同也有差异;而 Linux 使用的 GNU 版本的 grep 则功能更强,并且可以通过 -G、-E、-F 选项使用 egrep 和 fgrep 功能。

     在 Linux 下的 grep,除了 fgrep 之外,都支持 POSIX 的特殊字符类。其中字符集(POSIX Character class)是以 ‘[:’和‘:]’括起来的字符,而且需要放到 [] 内才能成为正则表达式,例如 [A-Za-z0-9] 与 [[:alnum:]] 等价;排序符号(Collating symbol)是以‘[.’和‘.]’括起来的字符,将多个字符序列视为一个元素,例如 [.cn.] 表示 cn 字符序列;等价字符集(Equivalence class)表示应视为等值的一族字符,使用‘[=’和‘=]’将字符括起来。正则表达式允许将 POSIX 字符集与其他字符集混用,例如 [[:alpha:]!] 匹配任意一个英文字母或者感叹号。

     上图中,使用了 [[:digit:]_]+ 正则表达式,它匹配一个或多个“数字字符或下划线”,使用 -E 参数来支持 ERE。
     匹配单个字符有四种方式:一般字符、转义的 meta 字符、点号‘.’meta 字符、方括号表达式。一般字符指未列于表 4-1 中的字符,包括文字和数字字符、空白字符和标点符号字符,一般字符匹配自身,例如正则 china 就匹配单词 china 而不是 China,如果想要同时匹配需要用方括号表达式。表 4-1 中列出了一些 meta 字符,表示一些特殊情况下的含义,当 meta 字符无法表示自己,而又需要这些字符时,就要用转义字符,将转义字符置于一般字符前,转义字符本身会被忽略。点号字符表示任一字符,很少单独使用点号符,经常与其他 meta 字符混用来匹配多个字符。方括号表达式(bracket expression)用以匹配不同的情况,例如 [cC]hina 只匹配 china 和 China,[^abc] 匹配除了 abc 意外的任意字符,同时在方括号表达式中,所有其他的 meta 字符都会失去含义,例如 [.] 匹配反斜杠和点号,而不是匹配句点。
     在基本正则表达式中,最简单的表示多个字符的方法是将多个字符连接起来。但是这种方法局限很多,而修饰符 meta 的应用提供了灵活的匹配能力。其中星号(*)meta 字符匹配 0 个或多个星号前的单个字符。区间表达式可以匹配指定字符的重复次数,例如 ab{3}c 匹配 a 和 c 之间的 b 重复出现三次,ab{3,}c 匹配 b 重复出现至少三次,ab{3,5}c 匹配 b 重复出现三次到五次。ERE 在匹配多个字符时与 BRE 很相似,但是支持更多的表达式,但 ERE 中的区间表达式不需要转义字符,它的 { 和 } 仅表示花括号本身。在 ERE 中,? 匹配 0 个或一个前置正则表达式,+ 匹配一个或多个前置正则表达式,例如 ab?c 只匹配 ac 和 abc,ab+c 匹配 abc、abbc、abbbc…… 而不匹配 ac。
     锚点字符(^ 和 $)用于匹配字符串的开头和结尾,^ 和 $ 一起使用,则两者之间的正则表达式匹配了整个正则表达式或整行,而 ^$ 匹配空的字符串或空行。BRE 中锚点仅仅在正则表达式的开始和结尾处才是 meta 字符,而在正则表达式中的锚点字符仅仅代表它自身,ERE 中锚点字符永远是 meta 字符,正则表达式中包含的锚点字符有意义,只是无法匹配上任何字符串,例如 abc^defg 在 BRE 中匹配字符串“abc^def”,而在 ERE 中永远也匹配不上任何东西。
     

     运算符优先级指在不同的 meta 字符同时出现时,高优先级的 meta 字符将比低优先级的先处理。
     BRE 中提供了一种机制名为“后向引用”(backreference),用于匹配之前正则表达式选定的部分。1 – 9 引用之前选定的模式,‘(’和‘)’括起想要之后引用的部分。例如 (ab)(cd)[efg]*12 匹配 abcdabcd、abcdeabcd、abcdfabcd、abcdgabcd,(go).*1 匹配一行中前后出现两个 go。
     交替是 ERE 才有的特性,当使用方括号表达式时,交替表示可以“匹配这个字符,或者那个字符”,但是无法“匹配这个字符序列或那个字符序列”。交替是在不同序列之间用管道符号隔开,例如 you|me 匹配 you 或 me。交替字符可以和管道符号意义在一个正则表达式中使用多个来提供多种选择。因为它的优先级最低,所以会一直扩展到新的交替字符,或正则表达式结束为止。
     在 BRE 中,使用一些 meta 字符修饰前置字符匹配重复的情况,但是仅仅只针对单个字符。在 ERE 中分组功能使 meta 字符修饰前置字符串,通过‘()’将式子括起来,例如(go)+ 匹配一个或多个连续的 go。在使用交替时,分组非常有用,例如(Lily|Lucy)限定了匹配 Lily 或 Lucy。

以上是“Shell中正则表达式怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注高防服务器网行业资讯频道!

[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[