zoukankan      html  css  js  c++  java
  • BASH_REMATCH[n]用法

    转载自https://blog.csdn.net/dc666/article/details/46007507

    从 bash 3以上版本里,已经自带正则匹配的功能, 很多情况下,可以不用awk/sed来做。 比如这个需求:

    <List>
        <Job id="1" name="abc"/>
        <Job id="2" name="zyz"/>
        <Job id="3" name="beew"/>
    </List>
    

    想要得到这个结果。

    abc | 1
    zyz | 2
    beew | 3
    

    我们用纯shell的方法。

    #!/bin/bash
    
    while read  line; do        //读入变量line
      if [[ $line =~ id="([0-9]+).*name="([^"]*) ]]; then   //子模式1为([0-9]+);子模式2为([^"]*)
        echo "${BASH_REMATCH[2]} | ${BASH_REMATCH[1]}"  
      fi
    done < file
    

    他的理解:
    子模式1为匹配出现一次或多次(+号的作用)任意0~9字符;子模式2为出现零次或多次(*号的作用)的非双引号"字符,其中[^"]取一切非双引号单个字符,反斜杠用来转义双引号"。接下来的echo "${BASH_REMATCH[n]}"中,按照先读取匹配子模式2的数组内容BASH_REMATCH{2},即上例中的abc,xyz,beew等等,接着打印竖线|,最后读取匹配子模式1的数组内容,即1,2,3。


    在运维场景下,我们经常需要在服务器上用正则表达式来匹配IP地址。

    shell和其它编程语言一样,也可以使用正则分组捕获,不过不能使用 $1或1这样的形式来捕获分组,可以通过数组${BASH_REMATCH}来获得,如${BASH_REMATCH[1]},${BASH_REMATCH[N]}

    下面以ip="121.0.2.2"为例,shell脚本代码如下(当然,你要做成更通用交互式的脚本,可以通过expect来实现):

    #!/bin/bash
    ip="121.0.2.2"
    if [[ $ip =~ ^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]]
    then
        echo "Match"
        echo ${BASH_REMATCH[1]}
        echo ${BASH_REMATCH[2]}
        echo ${BASH_REMATCH[3]}
        echo ${BASH_REMATCH[4]}
    else
        echo "Not match"
    fi
    

    返回结果为

    Match
    121
    0
    2
    2
    
    本人水平有限,还在不断学习中 难免有很多错误或者遗漏,望见谅
  • 相关阅读:
    Codeforces 1065C Make It Equal
    Codeforces 1065B Vasya and Isolated Vertices
    Codeforces 1065A Vasya and Chocolate
    Luogu P2467 [SDOI2010]地精部落
    Codeforces 1042C Array Product
    Codeforces 1041C Coffee Break
    JMeter安装和环境变量搭建
    Jenkins
    Jenkins介绍
    Docker
  • 原文地址:https://www.cnblogs.com/faberbeta/p/14275257.html
Copyright © 2011-2022 走看看