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