shell脚本8---正则表达式

正则表达式识别的特殊字符包括
*[]^${}\+?|()

锚字符

锁定在行首

脱字符^定义从数据流中文本行的行首开始的模式。要使用脱字符必须将它放在正则表达式中指定的模式的前面

echo "Book is great"|sed -n '/^Book/p'

如果将^放在模式中的其他位置而不是开头,它就会和普通字符一样。

锁定在行尾

美元符$定义了行尾的锚点。

组合锚点

用脱字符和美元符组合用来匹配完整的一行。如果中间不加任何字符,就是匹配空行。

点字符

点字符用来匹配任意的单字符,除了换行符。但点字符必须匹配一个字符,如果在点字符的位置没有字符,那么模式不成立。

cat data6
This is a test of a line.
The cat is sleeping.
That is the very nice hat.
This test is at line four
at ten O'clock we'll go home
$ sed -n '/.at/p' data6
The cat is sleeping.
That is the very nice hat.
This test is at line four -- 空格也是一个字符可以匹配到

字符组

要定义一个字符组,你要用方括号。

$ sed -n '/[ch]at/p' data6
The cat is sleeping.
That is the very nice hat.

排除字符组

字符组开头加个脱字符^可以匹配字符组中没有的任意字符。

$ sed -n '/[^ch]at/p' data6
This test is at line four

即便是排除,字符组仍然必须匹配一个字符,所以以at开头的行仍然未能匹配模式。

使用区间

[A-Za-z] # 大小写字母a b c ... z A B C ... Z
[0-9] # 数字0 1 2 ... 9

特殊字符组

描述
[[:alpha:]] 匹配任意字母字符,不管是大写还是小写
[[:alnum:]] 匹配任意字母数字字符09、az、A~Z
[[:blank:]] 匹配空格或制表符
[[:digit:]] 匹配0~9之间的数字
[[:lower:]] 匹配小写字符a~z
[[:print:]] 匹配任意可打印字符
[[:punct:]] 匹配标点符号
[[:space:]] 匹配任意空白字符:空格、制表符、NL、FF、VT和CR
[[:upper:]] 匹配任意大写字母字符A~Z
$ echo "abc"|sed -n '/[[:digit:]]/p' 
$ echo "abc"|sed -n '/[[:alpha:]]/p' 
abc

星号

在字符后面防止星号,说明该字符将会在匹配模式的文本中出现0次或者多次。

$ echo "ik"|sed -n '/ie*k/p'
ik
$ echo "iek"|sed -n '/ie*k/p'
iek
$ echo "ieek|sed -n '/ie*k/p'
ieek

将点号和星号组合起来使用,可以匹配任意多个任意字符。

$ echo "this is a regular pattern expression"|sed -n 'this is a regula.*expression'
this is a regular pattern expression

扩展正则表达式

  • 问号
    ? 匹配前面的字符0次或1次。
  • 加号
    + 匹配前面的字符1次或多次
  • 花括号
{m} 匹配前面字符m次
{m,n} 匹配前面的字符m到n次

默认情况下gawk程序不会识别正则表达式区间。必须为gawk指定--re-interval

# 匹配电话号码
gawk --re-interval '/^\(?[2-9][0-9]{2}\)? \ # 区号
(| |-|\.) \
[0-9]{3}( |-|\.) \ 
[0-9]{4}/ {print $0}
  • 管道字符
    类似于逻辑或,有一个模式匹配就匹配
expr1|expr2
  • 聚合表达式
    用括号()将正则表达式聚合起来,此时该组字符会被当作标准字符。
$ echo "Sat"|gawk '/Sat(urday)?/{print $0}'
Sat
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。