多行上的Shell脚本(bourne和/或bash)RegEx

多行上的Shell脚本(bourne和/或bash)RegEx,regex,bash,shell,multiline,Regex,Bash,Shell,Multiline,如何在Shell脚本(bourne和/或bash)中实现以下功能。。。类似于我所能做的,在文件上使用正则表达式(下面的内容示例) 我需要匹配模式,然后- 将“LD_PRELOAD=”右侧的内容捕获到变量中 文件内容: blah blah blah #Some comment LD_PRELOAD=/usr/lib64/libstdc++.so.6 export LD_PRELOAD #more comments 以下正则表达式在在线正则表达式生成器()上运行良好 我尝试使用Shell脚本

如何在Shell脚本(bourne和/或bash)中实现以下功能。。。类似于我所能做的,在文件上使用正则表达式(下面的内容示例)

  • 我需要匹配模式,然后-
  • 将“LD_PRELOAD=”右侧的内容捕获到变量中
  • 文件内容:

    blah
    blah blah
    #Some comment
    LD_PRELOAD=/usr/lib64/libstdc++.so.6
    
    export LD_PRELOAD
    
    #more comments
    
    以下正则表达式在在线正则表达式生成器()上运行良好


    我尝试使用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

    多亏了@Cyrus。我最终采纳了他的建议。在这里发布他的建议以获得更高的可视性,对于其他寻求类似Shell脚本多行正则表达式问题的人

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

    你想要什么还不清楚,这个剧本的最终目标是什么?您是否编写了任何代码作为示例?我的问题基本上是关于使用Shell脚本(bourne或bash)在文件中进行多行搜索。正如在OP中所指出的,我需要首先匹配这些线,然后将感兴趣的组捕获到一个变量中。有几件事情需要考虑,还有几种方法可以继续下去,但我怀疑BASH会是你最好的选择。至于正则表达式,有必要吗?如果您只需要匹配“LD_PRELOAD”,您可以先匹配它。。(使用awk、grep或任何其他工具)然后简化表达式以匹配“=”后面的任何内容。使用GNU grep:
    variable=$(grep-Poz'^LD\u PRELOAD=\K.*(=(\n)*^export LD\u PRELOAD$)文件)
    作为第一步:
    grep-Poz'LD\u PRELOAD=.*(\n.*export LD\u PRELOAD'文件
    。这将获取带有
    LD\u PRELOAD=
    的行、带有
    export LD\u PRELOAD
    的行以及这些行之间的所有行。下一步:
    \K
    删除
    \K
    之前的匹配部分,
    (?=regex)
    删除与此regex匹配的部分。它只保留第一行中
    =
    后面的部分。有关选项
    -P
    -o
    -z
    ,请参见:和
    man grep
    variable=$(grep -Poz '^LD_PRELOAD=\K.*(?=(\n.*)*^export LD_PRELOAD$)' file)