zoukankan      html  css  js  c++  java
  • shell学习----正则表达式

    在使用sed和gawk时如果能够熟练的使用正则表达式,可以准确的过滤到自己需要的信息

    Linux中,有两种流行的正则表达式引擎:

    • POSIX基础正则表达式,BRE引擎
    • POSIX扩展正则表达式,ERE引擎

    一、BRE模式

    1.1 纯文本

    基本上没什么可写的,区分大小写,多个空格也可以匹配。

    1.2 特殊字符

    正则表达式识别的特殊字符包括这些,如果需要使用特殊字符,需要转义符()。

    .*[]^${}+?|()

     1.3 锚字符

    • 或字符(^)锁定在行首
    • 美元符($)锁定在行尾
    • 两个组合(^$)可以过滤空行
    sed -n '/^this/p' data3 
    echo "This ^ is a test" | sed -n '/s ^/p'
    
    echo "This is a good book" | sed -n '/book$/p'
    echo "This book is good" | sed -n '/book$/p'
    
    sed -n '/^this is a test$/p' data4
    sed '/^$/d' data5
    使用例子

    1.4 点号字符

     匹配除换行符之外的任意单个字符。

    sed -n '/.at/p' data6

    1.5 字符组

     使用方括号来定义字符组

    sed -n '/[ch]at/p' data6
    echo "Yes" | sed -n '/[Yy]es/p'

    1.6 排除型字符组

     也可以反转字符组的作用,在字符组的开头加个脱字符

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

    1.7 区间

     用破折号可以表示字符中间的内容,第一个字符,破折号,最后一个字符

    sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data8

    1.8 特殊的字符组

    • [[:alpha:]]       匹配任意字母字符,不管是大写还是小写
    • [[:alnum:]]           匹配任意字母数字字符0~9、A~Z或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'
    echo "abc123" | sed -n '/[[:digit:]]/p'

    1.9 星号

    星号表明该字符必须在匹配模式的文本中出现0次或多次 

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

    二、ERE模式

    2.1 问号

    问号表明前面的字符可以出现0次或1次。

    echo "bt" | gawk '/be?t/{print $0}'
    bt
    echo "bet" | gawk '/be?t/{print $0}'
    bet
    echo "beet" | gawk '/be?t/{print $0}'
    
    echo "beeet" | gawk '/be?t/{print $0}'

    2.2 加号

    加号表明前面的字符可以出现1次或多次,但必须至少出现1次。

    echo "beeet" | gawk '/be+t/{print $0}'
    
    echo "beet" | gawk '/be+t/{print $0}'
    
    echo "bet" | gawk '/be+t/{print $0}'

    2.3 花括号

    花括号允许你可重复的正则表达式指定一个上限。这通常成为间隔,可以用两种格式来指定区间。 

    m:正则表达式准确出现m次。

    m,n:正则表达式至少出现m次,至多n次。

    echo "bt" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'
    
    echo "bat" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'
    
    echo "bet" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'

    2.4 管道符号

    就是linux里的|符号,一样的管道。应该是逻辑或的感觉

    echo "The cat is asleep" | gawk '/cat|dog/{print $0}'
    The cat is asleep
    echo "The dog is asleep" | gawk '/cat|dog/{print $0}'
    The dog is asleep
    echo "The sheep is asleep" | gawk '/cat|dog/{print $0}'

    2.5 表达式分组 

    使用园括号进行分组,当你将正则表达式模式分组时,该组会被视为一个标准字符。

    echo "Sat" | gawk '/Sat(urday)?/{print $0}'
    Sat
    echo "Saturday" | gawk '/Sat(urday)?/{print $0}'
    
    echo "cat" | gawk '/(c|b)a(b|t)/{print $0}'
    cat
    echo "cab" | gawk '/(c|b)a(b|t)/{print $0}'
    cab
    echo "bat" | gawk '/(c|b)a(b|t)/{print $0}'
    bat
    echo "bab" | gawk '/(c|b)a(b|t)/{print $0}'
    bab
    echo "tab" | gawk '/(c|b)a(b|t)/{print $0}'
    
    echo "tac" | gawk '/(c|b)a(b|t)/{print $0}'
  • 相关阅读:
    29-赫夫曼树
    28-线索化二叉树
    27-顺序存储二叉树
    26-二叉树的遍历查找和删除
    25-二叉树的概念
    24-逻辑结构分析
    23-哈希表
    22-查找算法
    21-堆排序
    Mui-列表/table-view
  • 原文地址:https://www.cnblogs.com/ch122633/p/10263108.html
Copyright © 2011-2022 走看看