zoukankan      html  css  js  c++  java
  • Linux shell正则表达式

    Linux shell正则表达式
    定义:用来过滤文本的模式模板。
    正则表达式类型:正则表达式是用正则表达引擎(regular expression engine)实现的。
    在Linux中,有两种流行的正则表达式引擎:
    1》POSIX基本正则表达式(BRE)引擎;
    2》POSIX扩展正则表达式(ERE)引擎。
    1、纯文本
    $ echo "This is a test" | sed -n '/test/p'
    2、特殊字符
    正则表达式的特殊字符包括:.*[]^${}\+?|()
    $ echo "The cost is \$4.00" | sed -n '/\$/p'
    3、锚字符
    脱字符(caret character, ^)定义从数据流中文本行的行首开始的模式。
    美元符($)特殊字符定义了行尾锚点。
    $ echo "This is a test" | sed -n '/^This is a test$/p'
    4、点字符
    点符号用来匹配任意的单字符,除了换行符,但点字符必须匹配一个字符,如果在点字符的位置没有字符,那么模式就不成立。
    $ cat data2
    This is a test of a line.
    The cat is sleeping.
    That is a very nice hat.
    This test is at line four.
    $ sed -n '/.at/p' data2
    The cat is sleeping.
    That is a very nice hat.
    This test is at line four.
    5、字符组
    $ sed -n '/[ch]at/p' data2
    The cat is sleeping.
    That is a very nice hat.
    6、排除字符组
    $ sed -n '/[^ch]at/p' data2  
    This test is at line four.
    7、使用区间
    $ cat data3
    60633
    46201
    223001
    4353
    22203
    $ sed -n '/^[0-9][0-9][0-9][0-9]$/p' data3 
    4353
    8、特殊字符组
    除了定义自己的字符组外,BRE还包含可用来匹配字符类型的特殊字符组。
    [[:alpha:]]     匹配任意字母字符,不管大小写
    [[:alnum:]]     匹配任意字母数字字符0~9、A~Z、a~z
    [[:blank:]]     匹配空格或制表符
    [[:digit:]]     匹配0~9之间的数字
    [[:lower:]]     匹配小写字母
    [[:print:]]     匹配任意可打印字符
    [[:punct:]]     匹配任意标点符号
    [[:space:]]     匹配任意空白字符:空格、制表符、NL、FF、VT和CR
    [[:upper:]]     匹配任意大写字母
    9、星号
    $ echo "ik" | sed -n '/ie*k/p'
    ik
    $ echo "iek" | sed -n '/ie*k/p' 
    iek
    $ echo "ieik" | sed -n '/ie*k/p'   
    ieik
     
    POSIX ERE模式包括一些Linux应用和工具使用的若干额外符号。awk程序能够识别ERE模式,但sed编辑器不能
    1、问号
    问号表示前面的字符可以出现0次或1次,但仅限于此。它不会匹配多次出现该字符。
    $ echo "bt" | awk '/be?t/ {print $0}' #出现0次
    bt
    $ echo "bet" | awk '/be?t/{print $0}' #出现1次
    bet
    2、加号
    加号是类似于星号的另一种模式符号,但跟问号也有不同。加号表明前面的字符可以出现1次或多次,但必须至少出现1次。
    $ echo "beet" | awk '/be+t/ {print $0}'
    beet
    $ echo "bt" | awk '/be+t/ {print $0}'
    3、使用花括号
    ERE中的花括号允许你为可重复的正则表达式指定一个上限。这通常称为区间(interval)。
    1》m     正则表达示准确出现m次。
    2》m, n  正则表达示至少出现m次,至多n次。
    awk好象不支持
    4、管道符号
    管道符号允许你在检查数据流时,用逻辑OR方式指定正则表达式引擎的两个或多个模式。
    使用管道符号的格式如下:
    expr1 | expr2 | ...
     
    $ echo "The cat is asleep" | awk '/cat | dog/{print $0}'
    The cat is asleep
    5、聚合表达式
    正则表达式模式也可以用圆括号聚合起来。当你聚合正则表达示模式时,该组就被当成标准字符。你可以在组内使用特殊字符。
    $ echo "Sat" | awk '/Sat(urday)?/ {print $0}'
    Sat
    将聚合和管道符号一起使用来创建可能的模式匹配组也是常见的:
    $ echo "cat" | awk '/(c|b)a(b|t)/ {print $0}'
    cat
     
    实用中的正则表达式
     
    1、目录文件计数
    $ cat countfiles.sh
    #!/bin/bash
    #count number of files in your path
    mypath=`echo $PATH | sed 's/:/ /g'`
    count=0
    for dir in $mypath
    do
        check=`ls $dir`
        for item in $check
        do
            count=$[ $count + 1]
        done
        echo "$dir -- $count"
        count=0
    done
     
    $ ./countfiles.sh
    /usr/lib/lightdm/lightdm -- 2
    /usr/local/sbin -- 0
    /usr/local/bin -- 0
    /usr/sbin -- 237
    /usr/bin -- 1858
    /sbin -- 175
    /bin -- 151
    /usr/games -- 4
     
    2、验证邮件地址
    $ cat isE-mail.sh
    #!/bin/bash
    #test email address
    awk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]+)$/ {print $0}'
     
    echo "rich@here.com" | ./isE-mail.sh
    rich@here.com
  • 相关阅读:
    算法实践--最长公共子序列(Longest Common Subsquence)
    算法实践--最长递增子序列(Longest Increasing Subsquence)
    googletest--Death Test和Exception Test
    googletest--测试控制
    googletest--Test Fixture
    googletest基本测试宏
    使用googletest进行C++单元测试(Netbeans为例)
    Boost--optional
    Boost--any
    Boost--variant (C++中的union)
  • 原文地址:https://www.cnblogs.com/sinaxyz/p/2820363.html
Copyright © 2011-2022 走看看