精华内容
参与话题
问答
  • Shell正则表达式 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所...

    摘自:https://www.cnblogs.com/hoji-real/articles/2311214.html

     

    Shell正则表达式

    一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。


    将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'/n' 匹配一个换行符。序列 '//' 匹配 "/" 而 "/(" 则匹配 "("。


    匹配输入字符串的开始位置。


    匹配输入字符串的结束位置。


    匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。


    匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。


    匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

    {n} 
    n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

    {n,} 
    n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

    {n,m} 
    m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。


    当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。


    匹配除 "/n" 之外的任何单个字符。要匹配包括 '/n' 在内的任何字符,请使用象 '[./n]' 的模式。

    (pattern) 
    匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '/(' 或 '/)'。

    (?:pattern) 
    匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

    (?=pattern) 
    正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    (?!pattern) 
    负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    x|y 
    匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

    [xyz] 
    字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

    [^xyz] 
    负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。

    [a-z] 
    字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

    [^a-z] 
    负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

    /b 
    匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er/b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

    /B 
    匹配非单词边界。'er/B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

    /cx 
    匹配由x指明的控制字符。例如, /cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

    /d 
    匹配一个数字字符。等价于 [0-9]。

    /D 
    匹配一个非数字字符。等价于 [^0-9]。

    /f 
    匹配一个换页符。等价于 /x0c 和 /cL。

    /n 
    匹配一个换行符。等价于 /x0a 和 /cJ。

    /r 
    匹配一个回车符。等价于 /x0d 和 /cM。

    /s 
    匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ /f/n/r/t/v]。

    /S 
    匹配任何非空白字符。等价于 [^ /f/n/r/t/v]。

    /t 
    匹配一个制表符。等价于 /x09 和 /cI。

    /v 
    匹配一个垂直制表符。等价于 /x0b 和 /cK。

    /w 
    匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

    /W 
    匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

    /xn 
    匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '/x41' 匹配 "A"。'/x041' 则等价于 '/x04' & "1"。正则表达式中可以使用 ASCII 编码。.

    /num 
    匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)/1' 匹配两个连续的相同字符。

    /n 
    标识一个八进制转义值或一个后向引用。如果 /n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

    /nm 
    标识一个八进制转义值或一个后向引用。如果 /nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 /nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 /nm 将匹配八进制转义值 nm。

    /nml 
    如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

    /un 
    匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, /u00A9 匹配版权符号 (?)。

    Grep正则表达式

    要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。

    $ ls -l | grep '^a' 
    通过管道过滤ls -l输出的内容,只显示以a开头的行。

    $ grep 'test' d* 
    显示所有以d开头的文件中包含test的行。

    $ grep 'test' aa bb cc 
    显示在aa,bb,cc文件中匹配test的行。

    $ grep '[a-z]/{5/}' aa 
    显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

    $ grep 'w/(es/)t.*/1' aa 
    如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(/1),找到就显示该行。如果用egrep或grep -E,就不用"/"号进行转义,直接写成'w(es)t.*/1'就可以了。

    grep正则表达式元字符集(基本集)

    锚定行的开始 如:'^grep'匹配所有以grep开头的行。


    锚定行的结束 如:'grep$'匹配所有以grep结尾的行。


    匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。


    匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。

    [] 
    匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。

    [^] 
    匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

    /(../) 
    标记匹配字符,如'/(love/)',love被标记为1。

    /< 
    锚定单词的开始,如:'/
    /> 
    锚定单词的结束,如'grep/>'匹配包含以grep结尾的单词的行。

    x/{m/} 
    重复字符x,m次,如:'0/{5/}'匹配包含5个o的行。

    x/{m,/} 
    重复字符x,至少m次,如:'o/{5,/}'匹配至少有5个o的行。

    x/{m,n/} 
    重复字符x,至少m次,不多于n次,如:'o/{5,10/}'匹配5--10个o的行。

    /w 
    匹配文字和数字字符,也就是[A-Za-z0-9],如:'G/w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。

    /W 
    /w的反置形式,匹配一个或多个非单词字符,如点号句号等。

    /b 
    单词锁定符,如: '/bgrepb/'只匹配grep。 

     

    Shell字符串处理

    1. 构造字符串
      直接构造
      STR_ZERO=hello
      STR_FIRST="i am a string"
      STR_SECOND='success'

      重复多次
      #repeat the first parm($1) by $2 times
      strRepeat()
      {
      local x=$2
      if [ "$x" == "" ]; then
      x=0
      fi

      local STR_TEMP=""
      while [ $x -ge 1 ];
      do
      STR_TEMP=`printf "%s%s" "$STR_TEMP" "$1"`
      x=`expr $x - 1`
      done
      echo $STR_TEMP
      }

      举例:
      STR_REPEAT=`strRepeat "$USER_NAME" 3`
      echo "repeat = $STR_REPEAT"
       
    2. 赋值与拷贝
      直接赋值
      与构造字符串一样
      USER_NAME=terry

      从变量赋值
      ALIASE_NAME=$USER_NAME

       
    3. 联接
      直接联接两个字符串
      STR_TEMP=`printf "%s%s" "$STR_ZERO" "$USER_NAME"`
      使用printf可以进行更复杂的联接
       
    4. 求长
      求字符数(char)
      COUNT_CHAR=`echo "$STR_FIRST" | wc -m`
      echo $COUNT_CHAR

      求字节数(byte)
      COUNT_BYTE=`echo "$STR_FIRST" | wc -c`
      echo $COUNT_BYTE

      求字数(word)
      COUNT_WORD=`echo "$STR_FIRST" | wc -w`
      echo $COUNT_WORD
       
    5. 比较
      相等比较
      str1 = str2

      不等比较
      str1 != str2

      举例:
      if [ "$USER_NAME" = "terry" ]; then
      echo "I am terry"
      fi

      小于比较
      # return 0 if the two string is equal, return 1 if $1 < $2, else 2 strCompare() { local x=0 if [ "$1" != "$2" ]; then x=2 local TEMP=`printf "%s/n%s" "$1" "$2"` local TEMP2=`(echo "$1"; echo "$2") | sort` if [ "$TEMP" = "$TEMP2" ]; then x=1 fi fi echo $x }
    6. 测试
      判空
      -z str

      判非空
      -n str

      是否为数字
      # return 0 if the string is num, otherwise 1
      strIsNum()
      {
      local RET=1
      if [ -n "$1" ]; then
      local STR_TEMP=`echo "$1" | sed 's/[0-9]//g'`
      if [ -z "$STR_TEMP" ]; then
      RET=0 
      fi
      fi
      echo $RET
      }

      举例:
      if [ -n "$USER_NAME" ]; then
      echo "my name is NOT empty"
      fi

      echo `strIsNum "9980"`

       
    7. 分割
      以符号+为准,将字符分割为左右两部分
      使用sed
      举例:
      命令 date --rfc-3339 seconds 的输出为
      2007-04-14 15:09:47+08:00
      取其+左边的部分
      date --rfc-3339 seconds | sed 's/+[0-9][0-9]:[0-9][0-9]//g'
      输出为
      2007-04-14 15:09:47
      取+右边的部分
      date --rfc-3339 seconds | sed 's/.*+//g'
      输出为
      08:00

      以空格为分割符的字符串分割
      使用awk
      举例:
      STR_FRUIT="Banana 0.89 100"
      取第3字段
      echo $STR_FRUIT | awk '{ print $3; }'
       
    8. 子字符串
      字符串1是否为字符串2的子字符串
      # return 0 is $1 is substring of $2, otherwise 1
      strIsSubstring()
      {
      local x=1
      case "$2" in
      *$1*) x=0;;
      esac
      echo $x
      }

     

    展开全文
  • 摘自:http://hi.baidu.com/door17/blog/item/7a049a396b6ed7f23b87ce2c.htmlhttp://blog.csdn.net/myvilla/archive/2006/08/31/1150598.aspx Shell正则表达式 一个正则表达式就是由普通字符(例如字符 a 到 z)...

    摘自:http://hi.baidu.com/door17/blog/item/7a049a396b6ed7f23b87ce2c.html

    http://blog.csdn.net/myvilla/archive/2006/08/31/1150598.aspx

     

    Shell正则表达式

    一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

    / hmcLinux联盟
    将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'/n' 匹配一个换行符。序列 '//' 匹配 "/" 而 "/(" 则匹配 "("。

    ^ hmcLinux联盟
    匹配输入字符串的开始位置。

    $ hmcLinux联盟
    匹配输入字符串的结束位置。

    * hmcLinux联盟
    匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。

    + hmcLinux联盟
    匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

    ? hmcLinux联盟
    匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

    {n} hmcLinux联盟
    n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

    {n,} hmcLinux联盟
    n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

    {n,m} hmcLinux联盟
    m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

    ? hmcLinux联盟
    当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

    . hmcLinux联盟
    匹配除 "/n" 之外的任何单个字符。要匹配包括 '/n' 在内的任何字符,请使用象 '[./n]' 的模式。

    (pattern) hmcLinux联盟
    匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '/(' 或 '/)'。

    (?:pattern) hmcLinux联盟
    匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

    (?=pattern) hmcLinux联盟
    正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    (?!pattern) hmcLinux联盟
    负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    x|y hmcLinux联盟
    匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

    [xyz] hmcLinux联盟
    字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

    [^xyz] hmcLinux联盟
    负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。

    [a-z] hmcLinux联盟
    字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

    [^a-z] hmcLinux联盟
    负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

    /b hmcLinux联盟
    匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er/b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

    /B hmcLinux联盟
    匹配非单词边界。'er/B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

    /cx hmcLinux联盟
    匹配由x指明的控制字符。例如, /cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

    /d hmcLinux联盟
    匹配一个数字字符。等价于 [0-9]。

    /D hmcLinux联盟
    匹配一个非数字字符。等价于 [^0-9]。

    /f hmcLinux联盟
    匹配一个换页符。等价于 /x0c 和 /cL。

    /n hmcLinux联盟
    匹配一个换行符。等价于 /x0a 和 /cJ。

    /r hmcLinux联盟
    匹配一个回车符。等价于 /x0d 和 /cM。

    /s hmcLinux联盟
    匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ /f/n/r/t/v]。

    /S hmcLinux联盟
    匹配任何非空白字符。等价于 [^ /f/n/r/t/v]。

    /t hmcLinux联盟
    匹配一个制表符。等价于 /x09 和 /cI。

    /v hmcLinux联盟
    匹配一个垂直制表符。等价于 /x0b 和 /cK。

    /w hmcLinux联盟
    匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

    /W hmcLinux联盟
    匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

    /xn hmcLinux联盟
    匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '/x41' 匹配 "A"。'/x041' 则等价于 '/x04' & "1"。正则表达式中可以使用 ASCII 编码。.

    /num hmcLinux联盟
    匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)/1' 匹配两个连续的相同字符。

    /n hmcLinux联盟
    标识一个八进制转义值或一个后向引用。如果 /n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

    /nm hmcLinux联盟
    标识一个八进制转义值或一个后向引用。如果 /nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 /nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 /nm 将匹配八进制转义值 nm。

    /nml hmcLinux联盟
    如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

    /un hmcLinux联盟
    匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, /u00A9 匹配版权符号 (?)。

    Grep正则表达式

    要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。

    $ ls -l | grep '^a'
    通过管道过滤ls -l输出的内容,只显示以a开头的行。

    $ grep 'test' d*
    显示所有以d开头的文件中包含test的行。

    $ grep 'test' aa bb cc
    显示在aa,bb,cc文件中匹配test的行。

    $ grep '[a-z]/{5/}' aa
    显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

    $ grep 'w/(es/)t.*/1' aa
    如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(/1),找到就显示该行。如果用egrep或grep -E,就不用"/"号进行转义,直接写成'w(es)t.*/1'就可以了。

    grep正则表达式元字符集(基本集)
    ^
    锚定行的开始 如:'^grep'匹配所有以grep开头的行。

    $
    锚定行的结束 如:'grep$'匹配所有以grep结尾的行。

    .
    匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。

    *
    匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。

    []
    匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。

    [^]
    匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

    /(../)
    标记匹配字符,如'/(love/)',love被标记为1。

    /<
    锚定单词的开始,如:'/
    />
    锚定单词的结束,如'grep/>'匹配包含以grep结尾的单词的行。

    x/{m/}
    重复字符x,m次,如:'0/{5/}'匹配包含5个o的行。

    x/{m,/}
    重复字符x,至少m次,如:'o/{5,/}'匹配至少有5个o的行。

    x/{m,n/}
    重复字符x,至少m次,不多于n次,如:'o/{5,10/}'匹配5--10个o的行。

    /w
    匹配文字和数字字符,也就是[A-Za-z0-9],如:'G/w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。

    /W
    /w的反置形式,匹配一个或多个非单词字符,如点号句号等。

    /b
    单词锁定符,如: '/bgrepb/'只匹配grep。 

     

    Shell字符串处理

    1. 构造字符串
      直接构造
      STR_ZERO=hello
      STR_FIRST="i am a string"
      STR_SECOND='success'

      重复多次
      #repeat the first parm($1) by $2 times
      strRepeat()
      {
      local x=$2
      if [ "$x" == "" ]; then
      x=0
      fi

      local STR_TEMP=""
      while [ $x -ge 1 ];
      do
      STR_TEMP=`printf "%s%s" "$STR_TEMP" "$1"`
      x=`expr $x - 1`
      done
      echo $STR_TEMP
      }

      举例:
      STR_REPEAT=`strRepeat "$USER_NAME" 3`
      echo "repeat = $STR_REPEAT"

    2. 赋值与拷贝
      直接赋值
      与构造字符串一样
      USER_NAME=terry

      从变量赋值
      ALIASE_NAME=$USER_NAME


    3. 联接
      直接联接两个字符串
      STR_TEMP=`printf "%s%s" "$STR_ZERO" "$USER_NAME"`
      使用printf可以进行更复杂的联接

    4. 求长
      求字符数(char)
      COUNT_CHAR=`echo "$STR_FIRST" | wc -m`
      echo $COUNT_CHAR

      求字节数(byte)
      COUNT_BYTE=`echo "$STR_FIRST" | wc -c`
      echo $COUNT_BYTE

      求字数(word)
      COUNT_WORD=`echo "$STR_FIRST" | wc -w`
      echo $COUNT_WORD

    5. 比较
      相等比较
      str1 = str2

      不等比较
      str1 != str2

      举例:
      if [ "$USER_NAME" = "terry" ]; then
      echo "I am terry"
      fi

      小于比较
      # return 0 if the two string is equal, return 1 if $1 < $2, else 2 strCompare() { local x=0 if [ "$1" != "$2" ]; then x=2 local TEMP=`printf "%s/n%s" "$1" "$2"` local TEMP2=`(echo "$1"; echo "$2") | sort` if [ "$TEMP" = "$TEMP2" ]; then x=1 fi fi echo $x }
    6. 测试
      判空
      -z str

      判非空
      -n str

      是否为数字
      # return 0 if the string is num, otherwise 1
      strIsNum()
      {
      local RET=1
      if [ -n "$1" ]; then
      local STR_TEMP=`echo "$1" | sed 's/[0-9]//g'`
      if [ -z "$STR_TEMP" ]; then
      RET=0
      fi
      fi
      echo $RET
      }

      举例:
      if [ -n "$USER_NAME" ]; then
      echo "my name is NOT empty"
      fi

      echo `strIsNum "9980"`


    7. 分割
      以符号+为准,将字符分割为左右两部分
      使用sed
      举例:
      命令 date --rfc-3339 seconds 的输出为
      2007-04-14 15:09:47+08:00
      取其+左边的部分
      date --rfc-3339 seconds | sed 's/+[0-9][0-9]:[0-9][0-9]//g'
      输出为
      2007-04-14 15:09:47
      取+右边的部分
      date --rfc-3339 seconds | sed 's/.*+//g'
      输出为
      08:00

      以空格为分割符的字符串分割
      使用awk
      举例:
      STR_FRUIT="Banana 0.89 100"
      取第3字段
      echo $STR_FRUIT | awk '{ print $3; }'

    8. 子字符串
      字符串1是否为字符串2的子字符串
      # return 0 is $1 is substring of $2, otherwise 1
      strIsSubstring()
      {
      local x=1
      case "$2" in
      *$1*) x=0;;
      esac
      echo $x
      }

     

    展开全文
  • 个人觉得作为一个程序员,最少应该学会一种正则表达式正则表达式好像真能提高一些效率。转自:http://www.cnblogs.com/hoji-real/articles/2311214.htmlShell正则表达式一个正则表达式就是由普通字符(例如字符 a ...

    个人觉得作为一个程序员,最少应该学会一种正则表达式。正则表达式好像真能提高一些效率。

    转自:http://www.cnblogs.com/hoji-real/articles/2311214.html

    Shell正则表达式

    一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。


    将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'/n' 匹配一个换行符。序列 '//' 匹配 "/" 而 "/(" 则匹配 "("。


    匹配输入字符串的开始位置。


    匹配输入字符串的结束位置。


    匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。


    匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。


    匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

    {n} 
    n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

    {n,} 
    n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

    {n,m} 
    m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。


    当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。


    匹配除 "/n" 之外的任何单个字符。要匹配包括 '/n' 在内的任何字符,请使用象 '[./n]' 的模式。

    (pattern) 
    匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '/(' 或 '/)'。

    (?:pattern) 
    匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

    (?=pattern) 
    正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    (?!pattern) 
    负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    x|y 
    匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

    [xyz] 
    字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

    [^xyz] 
    负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。

    [a-z] 
    字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

    [^a-z] 
    负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

    /b 
    匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er/b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

    /B 
    匹配非单词边界。'er/B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

    /cx 
    匹配由x指明的控制字符。例如, /cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

    /d 
    匹配一个数字字符。等价于 [0-9]。

    /D 
    匹配一个非数字字符。等价于 [^0-9]。

    /f 
    匹配一个换页符。等价于 /x0c 和 /cL。

    /n 
    匹配一个换行符。等价于 /x0a 和 /cJ。

    /r 
    匹配一个回车符。等价于 /x0d 和 /cM。

    /s 
    匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ /f/n/r/t/v]。

    /S 
    匹配任何非空白字符。等价于 [^ /f/n/r/t/v]。

    /t 
    匹配一个制表符。等价于 /x09 和 /cI。

    /v 
    匹配一个垂直制表符。等价于 /x0b 和 /cK。

    /w 
    匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

    /W 
    匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

    /xn 
    匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '/x41' 匹配 "A"。'/x041' 则等价于 '/x04' & "1"。正则表达式中可以使用 ASCII 编码。.

    /num 
    匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)/1' 匹配两个连续的相同字符。

    /n 
    标识一个八进制转义值或一个后向引用。如果 /n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。

    /nm 
    标识一个八进制转义值或一个后向引用。如果 /nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 /nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 /nm 将匹配八进制转义值 nm。

    /nml 
    如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

    /un 
    匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, /u00A9 匹配版权符号 (?)。

    Grep正则表达式

    要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。

    $ ls -l | grep '^a' 
    通过管道过滤ls -l输出的内容,只显示以a开头的行。

    $ grep 'test' d* 
    显示所有以d开头的文件中包含test的行。

    $ grep 'test' aa bb cc 
    显示在aa,bb,cc文件中匹配test的行。

    $ grep '[a-z]/{5/}' aa 
    显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

    $ grep 'w/(es/)t.*/1' aa 
    如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(/1),找到就显示该行。如果用egrep或grep -E,就不用"/"号进行转义,直接写成'w(es)t.*/1'就可以了。

    grep正则表达式元字符集(基本集)

    锚定行的开始 如:'^grep'匹配所有以grep开头的行。


    锚定行的结束 如:'grep$'匹配所有以grep结尾的行。


    匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。


    匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。

    [] 
    匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。

    [^] 
    匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

    /(../) 
    标记匹配字符,如'/(love/)',love被标记为1。

    /< 
    锚定单词的开始,如:'/
    /> 
    锚定单词的结束,如'grep/>'匹配包含以grep结尾的单词的行。

    x/{m/} 
    重复字符x,m次,如:'0/{5/}'匹配包含5个o的行。

    x/{m,/} 
    重复字符x,至少m次,如:'o/{5,/}'匹配至少有5个o的行。

    x/{m,n/} 
    重复字符x,至少m次,不多于n次,如:'o/{5,10/}'匹配5--10个o的行。

    /w 
    匹配文字和数字字符,也就是[A-Za-z0-9],如:'G/w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。

    /W 
    /w的反置形式,匹配一个或多个非单词字符,如点号句号等。

    /b 
    单词锁定符,如: '/bgrepb/'只匹配grep。 

     

    Shell字符串处理

    1. 构造字符串
      直接构造
      STR_ZERO=hello
      STR_FIRST="i am a string"
      STR_SECOND='success'

      重复多次
      #repeat the first parm($1) by $2 times
      strRepeat()
      {
      local x=$2
      if [ "$x" == "" ]; then
      x=0
      fi

      local STR_TEMP=""
      while [ $x -ge 1 ];
      do
      STR_TEMP=`printf "%s%s" "$STR_TEMP" "$1"`
      x=`expr $x - 1`
      done
      echo $STR_TEMP
      }

      举例:
      STR_REPEAT=`strRepeat "$USER_NAME" 3`
      echo "repeat = $STR_REPEAT"

    2. 赋值与拷贝
      直接赋值
      与构造字符串一样
      USER_NAME=terry

      从变量赋值
      ALIASE_NAME=$USER_NAME


    3. 联接
      直接联接两个字符串
      STR_TEMP=`printf "%s%s" "$STR_ZERO" "$USER_NAME"`
      使用printf可以进行更复杂的联接

    4. 求长
      求字符数(char)
      COUNT_CHAR=`echo "$STR_FIRST" | wc -m`
      echo $COUNT_CHAR

      求字节数(byte)
      COUNT_BYTE=`echo "$STR_FIRST" | wc -c`
      echo $COUNT_BYTE

      求字数(word)
      COUNT_WORD=`echo "$STR_FIRST" | wc -w`
      echo $COUNT_WORD

    5. 比较
      相等比较
      str1 = str2

      不等比较
      str1 != str2

      举例:
      if [ "$USER_NAME" = "terry" ]; then
      echo "I am terry"
      fi

      小于比较
      # return 0 if the two string is equal, return 1 if $1 < $2, else 2 strCompare() { local x=0 if [ "$1" != "$2" ]; then x=2 local TEMP=`printf "%s/n%s" "$1" "$2"` local TEMP2=`(echo "$1"; echo "$2") | sort` if [ "$TEMP" = "$TEMP2" ]; then x=1 fi fi echo $x }
    6. 测试
      判空
      -z str

      判非空
      -n str

      是否为数字
      # return 0 if the string is num, otherwise 1
      strIsNum()
      {
      local RET=1
      if [ -n "$1" ]; then
      local STR_TEMP=`echo "$1" | sed 's/[0-9]//g'`
      if [ -z "$STR_TEMP" ]; then
      RET=0 
      fi
      fi
      echo $RET
      }

      举例:
      if [ -n "$USER_NAME" ]; then
      echo "my name is NOT empty"
      fi

      echo `strIsNum "9980"`


    7. 分割
      以符号+为准,将字符分割为左右两部分
      使用sed
      举例:
      命令 date --rfc-3339 seconds 的输出为
      2007-04-14 15:09:47+08:00
      取其+左边的部分
      date --rfc-3339 seconds | sed 's/+[0-9][0-9]:[0-9][0-9]//g'
      输出为
      2007-04-14 15:09:47
      取+右边的部分
      date --rfc-3339 seconds | sed 's/.*+//g'
      输出为
      08:00

      以空格为分割符的字符串分割
      使用awk
      举例:
      STR_FRUIT="Banana 0.89 100"
      取第3字段
      echo $STR_FRUIT | awk '{ print $3; }'

    8. 子字符串
      字符串1是否为字符串2的子字符串
      # return 0 is $1 is substring of $2, otherwise 1
      strIsSubstring()
      {
      local x=1
      case "$2" in
      *$1*) x=0;;
      esac
      echo $x
      }
    展开全文
  • 正则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计...

    正则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。这些是正则表达式的定义。 由于起源于unix系统,因此很多语法规则一样的。但是随着逐渐发展,后来扩展出以下几个类型。了解这些对于学习正则表达式。

     

    一、正则表达式分类:

    1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx  简称 BREs)

    2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)

    3、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)

     

    说明:只有掌握了正则表达式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法

      

    二、Linux 中常用文本工具与正则表达式的关系 

    常握 Linux 下几种常用文本工具的特点,对于我们更好的使用正则表达式是很有帮助的

    • grep , egrep 正则表达式特点:

    1)grep 支持:BREs、EREs、PREs 正则表达式

    grep 指令后不跟任何参数,则表示要使用 ”BREs“ 

    grep 指令后跟 ”-E" 参数,则表示要使用 “EREs“

    grep 指令后跟 “-P" 参数,则表示要使用 “PREs"

     

    2)egrep 支持:EREs、PREs 正则表达式

    egrep 指令后不跟任何参数,则表示要使用 “EREs”

    egrep 指令后跟 “-P" 参数,则表示要使用 “PREs"

     

    3)grep 与 egrep 正则匹配文件,处理文件方法

    a. grep 与 egrep 的处理对象:文本文件

    b. grep 与 egrep 的处理过程:查找文本文件中是否含要查找的 “关键字”(关键字可以是正则表达式) ,如果含有要查找的 ”关健字“,那么默认返回该文本文件中包含该”关健字“的该行的内容,并在标准输出中显示出来,除非使用了“>" 重定向符号,

    c. grep 与 egrep 在处理文本文件时,是按行处理的

     

    • sed 正则表达式特点

    1)sed 文本工具支持:BREs、EREs

    sed 指令默认是使用"BREs"

    sed 命令参数 “-r ” ,则表示要使用“EREs"

    2)sed 功能与作用

    a. sed 处理的对象:文本文件

    b. sed 处理操作:对文本文件的内容进行 --- 查找、替换、删除、增加等操作

    c. sed 在处理文本文件的时候,也是按行处理的

    • Awkgawk)正则表达式特点

    1)Awk 文本工具支持:EREs

    awk 指令默认是使用 “EREs"

    2)Awk 文本工具处理文本的特点

    a. awk 处理的对象:文本文件

    b. awk 处理操作:主要是对列进行操作

     

     

     

    三、常见3中类型正则表达式比较

    字符

    说明

    Basic RegEx

    Extended RegEx

    python RegEx

    Perl regEx

    转义

     

    \

    \

    \

    \

    ^

    匹配行首,例如'^dog'匹配以字符串dog开头的行(注意:awk 指令中,'^'则是匹配字符串的开始)

    ^

    ^

    ^

    ^

    $

    匹配行尾,例如:'^、dog$'匹配以字符串 dog 为结尾的行(注意:awk 指令中,'$'则是匹配字符串的结尾)

    $

    $

    $

    $

    ^$

    匹配空行

    ^$

    ^$

    ^$

    ^$

    ^string$

    匹配行,例如:'^dog$'匹配只含一个字符串 dog 的行

    ^string$

    ^string$

    ^string$

    ^string$

    \<

    匹配单词,例如:'\<frog' (等价于'\bfrog'),匹配以 frog 开头的单词

    \<

    \<

    不支持

    不支持(但可以使用\b来匹配单词,例如:'\bfrog')

    \>

    匹配单词,例如:'frog\>'(等价于'frog\b '),匹配以 frog 结尾的单词

    \>

    \>

    不支持

    不支持(但可以使用\b来匹配单词,例如:'frog\b')

    \<x\>

    匹配一个单词或者一个特定字符,例如:'\<frog\>'(等价于'\bfrog\b')、'\<G\>'

    \<x\>

    \<x\>

    不支持

    不支持(但可以使用\b来匹配单词,例如:'\bfrog\b'

    ()

    匹配表达式,例如:不支持'(frog)'

    不支持(但可以使用\(\),如:\(dog\)

    ()

    ()

    ()

    \(\)

    匹配表达式,例如:不支持'(frog)'

    \(\)

    不支持(同())

    不支持(同())

    不支持(同())

    匹配前面的子表达式 0 次或 1 次(等价于{0,1}),例如:where(is)?能匹配"where" 以及"whereis"

    不支持(同\?)

    \?

    匹配前面的子表达式 0 次或 1 次(等价于'\{0,1\}'),例如:'where\(is\)\? '能匹配 "where"以及"whereis"

    \?

    不支持(同?)

    不支持(同?)

    不支持(同?)

    ?

    当该字符紧跟在任何一个其他限制符(*, +, ?, {n},{n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个"o",而 'o+' 将匹配所有 'o'

    不支持

    不支持

    不支持

    不支持

    .

    匹配除换行符('\n')之外的任意单个字符(注意:awk 指令中的句点能匹配换行符)

    .

    .(如果要匹配包括“\n”在内的任何一个字符,请使用:'(^$)|(.)

    .

    .(如果要匹配包括“\n”在内的任何一个字符,请使用:' [.\n] '

    *

    匹配前面的子表达式 0 次或多次(等价于{0, }),例如:zo* 能匹配 "z"以及 "zoo"

    *

    *

    *

    *

    \+

    匹配前面的子表达式 1 次或多次(等价于'\{1, \}'),例如:'where\(is\)\+ '能匹配 "whereis"以及"whereisis"

    \+

    不支持(同+)

    不支持(同+)

    不支持(同+)

    +

    匹配前面的子表达式 1 次或多次(等价于{1, }),例如:zo+能匹配 "zo"以及 "zoo",但不能匹配 "z"

    不支持(同\+)

    +

    +

    +

    {n}

    n 必须是一个 0 或者正整数,匹配子表达式 n 次,例如:zo{2}能匹配

    不支持(同\{n\})

    {n}

    {n}

    {n}

    {n,}

    "zooz",但不能匹配 "Bob"n 必须是一个 0 或者正整数,匹配子表达式大于等于 n次,例如:go{2,}

    不支持(同\{n,\})

    {n,}

    {n,}

    {n,}

    {n,m}

    能匹配 "good",但不能匹配 godm 和 n 均为非负整数,其中 n <= m,最少匹配 n 次且最多匹配 m 次 ,例如:o{1,3}将配"fooooood" 中的前三个 o(请注意在逗号和两个数之间不能有空格)

    不支持(同\{n,m\})

    {n,m}

    {n,m}

    {n,m}

    x|y

    匹配 x 或 y,例如: 不支持'z|(food)' 能匹配 "z" 或"food";'(z|f)ood' 则匹配"zood" 或 "food"

    不支持(同x\|y)

    x|y

    x|y

    x|y

    [0-9]

    匹配从 0 到 9 中的任意一个数字字符(注意:要写成递增)

    [0-9]

    [0-9]

    [0-9]

    [0-9]

    [xyz]

    字符集合,匹配所包含的任意一个字符,例如:'[abc]'可以匹配"lay" 中的 'a'(注意:如果元字符,例如:. *等,它们被放在[ ]中,那么它们将变成一个普通字符)

    [xyz]

    [xyz]

    [xyz]

    [xyz]

    [^xyz]

    负值字符集合,匹配未包含的任意一个字符(注意:不包括换行符),例如:'[^abc]' 可以匹配 "Lay" 中的'L'(注意:[^xyz]在awk 指令中则是匹配未包含的任意一个字符+换行符)

    [^xyz]

    [^xyz]

    [^xyz]

    [^xyz]

    [A-Za-z]

    匹配大写字母或者小写字母中的任意一个字符(注意:要写成递增)

    [A-Za-z]

    [A-Za-z]

    [A-Za-z]

    [A-Za-z]

    [^A-Za-z]

    匹配除了大写与小写字母之外的任意一个字符(注意:写成递增)

    [^A-Za-z]

    [^A-Za-z]

    [^A-Za-z]

    [^A-Za-z]

    \d

    匹配从 0 到 9 中的任意一个数字字符(等价于 [0-9])

    不支持

    不支持

    \d

    \d

    \D

    匹配非数字字符(等价于 [^0-9])

    不支持

    不支持

    \D

    \D

    \S

    匹配任何非空白字符(等价于[^\f\n\r\t\v])

    不支持

    不支持

    \S

    \S

    \s

    匹配任何空白字符,包括空格、制表符、换页符等等(等价于[ \f\n\r\t\v])

    不支持

    不支持

    \s

    \s

    \W

    匹配任何非单词字符 (等价于[^A-Za-z0-9_])

    \W

    \W

    \W

    \W

    \w

    匹配包括下划线的任何单词字符(等价于[A-Za-z0-9_])

    \w

    \w

    \w

    \w

    \B

    匹配非单词边界,例如:'er\B' 能匹配 "verb" 中的'er',但不能匹配"never" 中的'er'

    \B

    \B

    \B

    \B

    \b

    匹配一个单词边界,也就是指单词和空格间的位置,例如: 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的'er'

    \b

    \b

    \b

    \b

    \t

    匹配一个横向制表符(等价于 \x09和 \cI)

    不支持

    不支持

    \t

    \t

    \v

    匹配一个垂直制表符(等价于 \x0b和 \cK)

    不支持

    不支持

    \v

    \v

    \n

    匹配一个换行符(等价于 \x0a 和\cJ)

    不支持

    不支持

    \n

    \n

    \f

    匹配一个换页符(等价于\x0c 和\cL)

    不支持

    不支持

    \f

    \f

    \r

    匹配一个回车符(等价于 \x0d 和\cM)

    不支持

    不支持

    \r

    \r

    \\

    匹配转义字符本身"\"

    \\

    \\

    \\

    \\

    \cx

    匹配由 x 指明的控制字符,例如:\cM匹配一个Control-M 或回车符,x 的值必须为A-Z 或 a-z 之一,否则,将 c 视为一个原义的 'c' 字符

    不支持

    不支持

     

    \cx

    \xn

    匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长,例如:'\x41' 匹配 "A"。'\x041' 则等价于'\x04' & "1"。正则表达式中可以使用 ASCII 编码

    不支持

    不支持

     

    \xn

    \num

    匹配 num,其中 num是一个正整数。表示对所获取的匹配的引用

    不支持

    \num

    \num

     

    [:alnum:]

    匹配任何一个字母或数字([A-Za-z0-9]),例如:'[[:alnum:]] '

    [:alnum:]

    [:alnum:]

    [:alnum:]

    [:alnum:]

    [:alpha:]

    匹配任何一个字母([A-Za-z]), 例如:' [[:alpha:]] '

    [:alpha:]

    [:alpha:]

    [:alpha:]

    [:alpha:]

    [:digit:]

    匹配任何一个数字([0-9]),例如:'[[:digit:]] '

    [:digit:]

    [:digit:]

    [:digit:]

    [:digit:]

    [:lower:]

    匹配任何一个小写字母([a-z]), 例如:' [[:lower:]] '

    [:lower:]

    [:lower:]

    [:lower:]

    [:lower:]

    [:upper:]

    匹配任何一个大写字母([A-Z])

    [:upper:]

    [:upper:]

    [:upper:]

    [:upper:]

    [:space:]

    任何一个空白字符: 支持制表符、空格,例如:' [[:space:]] '

    [:space:]

    [:space:]

    [:space:]

    [:space:]

    [:blank:]

    空格和制表符(横向和纵向),例如:'[[:blank:]]'ó'[\s\t\v]'

    [:blank:]

    [:blank:]

    [:blank:]

    [:blank:]

    [:graph:]

    任何一个可以看得见的且可以打印的字符(注意:不包括空格和换行符等),例如:'[[:graph:]] '

    [:graph:]

    [:graph:]

    [:graph:]

    [:graph:]

    [:print:]

    任何一个可以打印的字符(注意:不包括:[:cntrl:]、字符串结束符'\0'、EOF 文件结束符(-1), 但包括空格符号),例如:'[[:print:]] '

    [:print:]

    [:print:]

    [:print:]

    [:print:]

    [:cntrl:]

    任何一个控制字符(ASCII 字符集中的前 32 个字符,即:用十进制表示为从 0 到31,例如:换行符、制表符等等),例如:' [[:cntrl:]]'

    [:cntrl:]

    [:cntrl:]

    [:cntrl:]

    [:cntrl:]

    [:punct:]

    任何一个标点符号(不包括:[:alnum:]、[:cntrl:]、[:space:]这些字符集)

    [:punct:]

    [:punct:]

    [:punct:]

    [:punct:]

    [:xdigit:]

    任何一个十六进制数(即:0-9,a-f,A-F)

    [:xdigit:]

    [:xdigit:]

    [:xdigit:]

    [:xdigit:]

     

    四、三种不同类型正则表达式比较

    注意: 当使用 BERs(基本正则表达式)时,必须在下列这些符号前加上转义字符('\'),屏蔽掉它们的 speical meaning  “?,+,|,{,},(,)” 这些字符,需要加入转义符号”\”

     

    注意:修饰符用在正则表达式结尾,例如:/dog/i,其中 “ i “ 就是修饰符,它代表的含义就是:匹配时不区分大小写,那么修饰符有哪些呢?常见的修饰符如下:

    g   全局匹配(即:一行上的每个出现,而不只是一行上的第一个出现)
    s    把整个匹配串当作一行处理
    m    多行匹配
    i    忽略大小写
    x    允许注释和空格的出现
    U    非贪婪匹配

     

    以上就是linux 常见3种类型正则表达式异同之处,整体了解这些,我相信在使用这些工具的时候,就可以更加清楚明晰了。

     

    转载于:https://www.cnblogs.com/finallyliuyu/archive/2013/05/27/3101220.html

    展开全文
  • 正则表达式是一种表示方式,可以让你查找匹配特定的准则的文本,例如以字母a开头的文件,学好正则表达式将使以后的文本处理变得方便,快速,本文给大家介绍shell正则表达式学习笔记,对shell正则表达式相关知识感...
  • Shell正则表达式 1. shell 正则表达式的几种形式: cat txt no is ok so is ok ok is no so it is ok you are no so he is no so 12 is good 39 + 45 = 84 this is bad weather sono is bad boy. (1). grep ...
  • Shell 正则表达式

    千次阅读 2016-09-07 19:32:10
    什么是正则表达式正则表达式是用于描述字符排列和匹配模式的一种语法规则。 它主要用于字符串的模式分割、匹配、查找以及替换操作。概念看看就行,为了保证博文的完整性,记录下,其实没太大用….正则表达式的分类 ...
  • Shell正则表达式

    千次阅读 2019-08-12 17:51:20
    正则表达式是一种定义的,用于描述字符排列和匹配模式的一种语法规则,linux系统中的文本处理工具可以借助shell正则表达式处理文本文档。使用正则表达式可以帮助我们快速获取需要的信息,是我们的工作更加简单、方便...
  • 在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换...基本的正则表达式 扩展的正则表达式 Perl 的正则表达式
  • 主要介绍了shell 正则表达式整理的相关资料,需要的朋友可以参考下
  • shell正则表达式

    2018-06-11 10:46:06
    shell正则表达式使用正则表达式最大的问题在于有不止一种类型的正则表达式:编程语言(Java,Perl和Python)、Linux实用工具(sed,gawk和grep)以及主流应用(MySQL和PostgreSQL数据服务器)。而且正则表达式是通过...
  • shell 正则表达式

    2012-03-26 12:39:39
    shell脚本中成功地使用sed编辑器和gawk程序的关键是自如地使用正则表达式,设法从大批数据中筛选特定的数据非常复杂。所以说,这是一个难点! 1、正则表达式 1.1、正则表达式的定义 linux使用程序在输入数据时...

空空如也

1 2 3 4 5 ... 20
收藏数 6,780
精华内容 2,712
关键字:

shell正则