Shell编程基础(十三)正则表达式

正则表达式

    • 正则表达式
    • 元数据
      • 普通元字符
      • 扩展元字符
    • 总结
      • ^ 和 \< 的区别 以及 $ 和 \> 的区别
      • * + ? {}的区别

正则表达式

格式:^ 表达式 $
在不同的场景下,定义是一样,但使用要按照具体的命令去调用,中间的表达式都是通用的

元数据

普通元字符

所谓元数据,就是描述数据的数据,在这里就是描述正则的数据

  • ^ 表示正则从字符串整行起始位置匹配
    ^abc 匹配 以abc开始的字符串
  • $ 表示正则一直匹配到字符串整行结束位置
    abc$ 匹配以abc结尾的字符串

如果一个正则表达式不是^开始,表示不限制字符串前缀内容,如果不是$结束,则不限制字符串后缀内容,如果都没有,则表示任意位置匹配上都算成功

[root@origin ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@origin ~]# cat /etc/passwd | grep ^root
root:x:0:0:root:/root:/bin/bash



[root@origin ~]# grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
kalpana:x:1000:1000:kalpana:/home/kalpana:/bin/bash
zp:x:1001:1001::/home/zp:/bin/bash
[root@origin ~]# cat /etc/passwd | grep bash$
root:x:0:0:root:/root:/bin/bash
kalpana:x:1000:1000:kalpana:/home/kalpana:/bin/bash
zp:x:1001:1001::/home/zp:/bin/bash
  • . 一个点,匹配一个任意字符

  • " * " 星号,匹配左侧紧挨的那个字符 0次或多次;如 “123*”:匹配 12 和 12后面紧跟3的字符串(123,1233,1234.但是不匹配 124
    **直觉上直接就是前缀匹配前面的固定字符,但实际还可以匹配 去掉*左侧紧挨的那个字符后的字符串

  • .* 根据上面 星号的定义,可以得出 .* 可以匹配任意字符串

  • [] 匹配括号内任意一个字符。 1[abc]2 可以匹配 1a2 1b2 1c2

  • [^] 不匹配括号内所有字符。1[^ab]2 可以匹配除了 1a2 和 1b2 之外的字符串

  • [-] 匹配一个连续的范围。[0-9] 匹配一个 0-9的字符

  • \ 转义符,这在各种编程语言中都是存在的,其目的是去掉一些原本带有特殊含义的字符代表的特殊含义,使其变成字面意思。只作用在一个字符上

  • ‘’ “” 单引号 / 双引号 也可以转义,但是他俩带有边界,可能影响原有字符串 引号的边界。‘’ 单引号为强引用,其内部所有字符均被转义; “” 双引号为弱引用,其内部部分字符被转义;比如空格被转义,但是可以使用 $获取变量

  • \< 词首(空格隔开为一个词,词首可能不是整行第一个单词)匹配

  • \> 词尾(空格隔开为一个词)匹配 >abc。 匹配形如 xxxabc 或者 xxxabc xxx 的字符串

  • () 将多个字符视为一个整体,用于后面匹配,替换等操作
    如:给匹配上的字符串增加一个前缀 s/(^bc)xx/\1de/ ;匹配 bcxx开头的字符串,然后 \1 的值就是前面^bc命中的字符串括号内的部分,然后把()内的字符串(也就是bc)取出来,并将后面的xx换成de。
    \1 代表前面第一个()内的内容
    \2 代表前面第二个()内的内容
    依次类推

    s/查找字符串/要替换的字符串/

  • x{m} 匹配 前导字符 重复的次数。这里意味着匹配m * n个x(n 正整数)

  • x{m,} 匹配 前导字符 重复次数大于等于 m

  • x{m,n} 匹配 前导字符 重复次数大于等于 m 小于等于n

扩展元字符

grep 默认只支持普通元字符,要使用扩展元字符,要么使用 grep -E 选项 要么使用 egrep 命令

测试文本如下

a
ab
ac
abc
abbc
abbbc
abbbcc
  • +
    匹配一个或多个前导字符,和 * 的区别在于 * 匹配的是0个或多个前导字符,而 + 是1个或多个。ab+c 匹配 abc abbc abbbc
    ab*c 匹配 ac abc abbc abbbc
    相当于 * 比 + 多了一种不包含前导字符的情况。
grep "ab*c" test_reg.txt
ac
abc
abbc
abbbc
abbbcc


grep -E "ab+c" test_reg.txt
abc
abbc
abbbc
abbbcc

egrep "ab+c" test_reg.txt
abc
abbc
abbbc
abbbcc

  • 匹配 0 或 1个 前导字符

  • |
    匹配 | 分隔的任意一项

  • ()
    将多个字符作为一个整体进行匹配。如果没有()分割,则会将原本分隔的地方前后的字符串当作一个字符串处理
    abc(de|aa):这里就匹配 abcde 或者 abcaa
    如果不加()
    abcde|aa:则变成了 匹配 abcde 或者 aa

总结

^ 和 < 的区别 以及 $ 和 > 的区别

上述2种区别都类似:
^ $ 匹配的是整个字符串的首尾
而 \< \> 匹配的是字符串中的词(整个字符串根据空格可以拆分成多个词)的首尾

* + ? {}的区别

  • ’ * ’ :星号代表的是 0 或者 多个 前导字符
    abc* 等同于 abc{0,}

  • ’ + ’ :代表匹配 1个 或者 多个 前导字符
    abc+ 等同于 abc{1,}

  • ? 代表 0个 或者 1个 前导字符
    abc? 等同于 abc{0,1}

你可能感兴趣的:(Linux,正则表达式,shell)