0%

shell之正则表达式

正则表达式

先说说正则表达式的含义,正则表达式是一种模板,数据如果匹配模板,他就可以进行下一步的处理,不匹配就会过滤掉。

正则表达式的类型

锚字符

  • 锁定在行首(^),(^)定义数据流文本从行首开始的模式,例如,echo "the book store" | sed -n '/^book/p'则匹配不到
  • 注意,如果将^号放在模式开头的其他位置,那么他就和普通字符一样了,不再是特殊字符了
  • 锁定在行尾($),($)与锁定在行首的规则一样

点号字符

  • 点号用来匹配出换行符之外的任意单个字符,他必须匹配一个字符,如果没匹配上,则模式就不成立了
  • sed -n '/.at/p' data

字符组

  • 字符组可以定义用来匹配文本模式中某个位置的一组字符,如果字符组中的某个字符出现在数据流中,则算是匹配上了

  • sed -n '/[ch]at/p' data6

  • echo "yeS" | sed -n '/[Yy][Ee][Ss]/p'

排除型字符组

  • 排除型,意思是寻找组中没有的字符,操作是在字符组前面加一个脱字符(^)
  • sed -n '/[^ch]at/p' data6

区间

  • 单破折号(-)在字符组中可以表示区间的意思,只需要指定区间的第一个字符和最后一个字符就好了
  • sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data8:每个字符组都会匹配0到9的数字
    • 还可以在单个字符组中指定多个不连续的区间:sed -n '/[a-ch-m]at/p' data6:允许出现a到c,h到m的字母出现在at前

星号

  • 在字符后面放置星号,表明该字符必须在匹配模式中出现0次或多次。
  • echo "ik" | sed -n '/ie*k/p'

扩展正则表达式

扩展表达式提供了一个额外的功能和符号,gawk可以识别,但是sed编辑器无法识别

问号

  • 问号表明前面的字符可以出现0次或一次,但是他不会匹配多次出现的字符
  • echo "bt" | gawk '/be?t/{print $0}'

加号

  • 加号表明前面的字符可以出现1次或者多次,至少出现一次
  • echo "beet" | gawk '/be+t/{print $0}'

花括号

  • 花括号允许你为可重复的正则指定一个上限,可以两种格式来指定
  • m:正则表达式准确出现m次
  • m,n:正则表达式至少出现m次,至多n次
  • 注意:默认情况gawk不识别间隔,需要指定–re interval
  • echo "bt" | gawk --re-interval '/be{1}t/{print $0}'

管道符号

  • 管道符号允许在检查数据流时,用or的方式指定正则表达式引擎要用的两个或者多个模式。任意一个匹配上,则通过测试
  • 使用的方式:expr|expr2
  • echo "The cat is asleep" | gawk '/cat|dog/{print $0}'
  • 需要注意的是,正则表达式和管道之间是不能有空格的,

表达式分组

  • 正则表达式可以使用圆括号进行分组,将正则表达式分组时,该组会被视为一个标准字符,可以像普通字符一样,给这个组使用特殊字符
  • echo "cab" | gawk '/(c|b)a(b|t)/{print $0}'

总结以上的规则如下表

正则表达式 描述 示例
^ 行起始标记 ^app匹配以app开头的文本
$ 行尾标记 le$匹配以le结尾的文本
. 匹配任意一个字符 ap.le只能i匹配apple不能匹配appple
[] 匹配包含在[字符]中的任意一个字符 coo[kl] 匹配cook或者cool
[^] ^脱字符,取反 9[ ^1]匹配除了91以外得值
[-] 匹配[]中指定范围中的任意一个字符 [1-5]1到5之间的任意一个字符
匹配之前的项1次或者0次 colou?r匹配color或者colour
+ 匹配之前的项1此或者多次 model+,匹配modell或者modellll,不能匹配model
* 匹配之前的项0次或者多次 co*l,匹配cl,col,coool等
() 匹配一个用于匹配的子串 ma(tri)?匹配max或者maxtrix
{n} 匹配之前的项n次 [0-9]{3} 任意匹配三位数,等同于[0-9] [0-9] [0-9]
{n,} 至少匹配n次
{n,m} 匹配n到m次
| 交替-匹配|两边的任意一项 act(lst|2nd) 匹配octlst或者act2nd
\ 转义符可以对上面的的特殊字符进行转义, a\ .b匹配a.b但是不能匹配ajb.

扩展的规则

  • POSIX字符类是形如[:..:]的特殊元字符,规律如下
正则表达式 描述
[::alnum:] 字母与数字字符
[:alpha:] 字母字符包括大小写字母
[:blank:] 空格与制表符
[:digit:] 数字字符
[:lower:] 小写字母
[:upper:] 大写字母
[:punct:] 标点符号
[:space:] 包括换行符,回车在内的所有空白字符
~~