Shell脚本(bourne和/或bash)RegEx over Multiple Lines

时间:2017-07-25 17:19:44

标签: regex bash shell multiline

如何在Shell脚本( bourne和/或bash )中实现以下功能......使用类似于我的功能,在文件上使用RegEx(下面的内容示例)

  1. 我需要匹配模式,然后 -
  2. 将内容捕获到' LD_PRELOAD ='的右侧。变成一个变量。
  3. 文件内容:

    blah
    blah blah
    #Some comment
    LD_PRELOAD=/usr/lib64/libstdc++.so.6
    
    export LD_PRELOAD
    
    #more comments
    

    以下RegEx适用于在线Regex Builder(https://regex101.com/r/XW0JVR/1

    /LD_PRELOAD=(\S+)[\n\r]+^\s*export\s+LD_PRELOAD/gm
    

    我使用Shell脚本尝试了以下操作,但它不起作用......

    #!/bin/bash
    envvars_stdFile="tempEnvVarsStd"
    
    regEx="LD_PRELOAD=(\S+)[\n\r]+^\s*export\s+LD_PRELOAD"
    
    if [[ "${envvars_stdFile}" =~ "${regEx}" ]]
    then
        cppLib="${BASH_REMATCH[1]}"
        echo "cppLib is: $cppLib"
    else
       echo "RegEx Pattern (${regEx}) doesn't match in file: $envvars_stdFile"
    fi
    

    它产生: RegEx模式(LD_PRELOAD =(\ S +)[\ n \ r] + ^ \ s * export \ s + LD_PRELOAD)在文件中不匹配:tempEnvVarsStd

1 个答案:

答案 0 :(得分:0)

感谢@Cyrus。我最终使用了他的建议。在此处发布他的建议以获得更多可见性,其他人则寻找Shell Script MultiLine RegEx的类似问题...

variable=$(grep -Poz '^LD_PRELOAD=\K.*(?=(\n.*)*^export LD_PRELOAD$)' file)