微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用BASH脚本解析文件并将复制模式匹配到变量

如何解决用BASH脚本解析文件并将复制模式匹配到变量

|| 假设我有一个文件(碰巧是PHP),其中包含许多变量声明:
$dbuser = \'fred\';
$dppass = \'abc123\';
$dhhost = \'127.0.0.1\';
我要从BASH脚本执行的操作是解析此文件,识别所需的变量,并将其值读入可以从BASH脚本访问的变量。 显然,上面的文件PHP,还有其他我不感兴趣的行。 我可以使用以下命令从bash shell中提取所需的信息:
grep \\$dbuser config.PHP.inc | grep -Po \"\\\'.*\\\'\" | cut -d \\\' -f 2
整齐地返回
fred
但是,当我尝试将其添加到bash脚本中以使用反引号将输出放入变量时,如下所示:
dbuser=`grep \\$dbuser config.PHP.inc | grep -Po \"\\\'.*\\\'\" | cut -d \\\' -f 2`
我的BASH脚本此时挂起。 为什么会这样悬而未决?或者,有没有更好的方法来完成我要实现的目标?     

解决方法

        这将返回类似
var=\'value\';
的文本
awk \'
    match($1,/^\\$([[:alnum:]_]+)=?/,m){
        gsub(/^[^=]+=[[:space:]]*/,\"\")
        print m[1] \"=\" $0
    }
\' < file.php
您可以将输出“ 6”。 更新 这比上面简单得多。我意识到您需要做的就是删除第一个
$
并删除
=
周围的空格:
sed -e \'s/\\$//\' -e \'s/ *= */=/\' file.php
    ,        尝试这种方式:
dbuser=$(grep \\$dbuser config.php.inc | grep -Po \"\\\'.*\\\'\" | cut -d \\\' -f 2)
这样做的原因和反引号不起作用的原因是$(command)处理引用的方式与旧样式的反引号如何处理引用的方式不同。 换句话说,以下反引号命令也可以正常工作:
dbuser=`grep \'$dbuser\' config.php.inc | grep -Po \"\'.*\'\" | cut -d\"\'\" -f 2`
使用单引号将$ dbuser括起来,因为单引号意味着使用文字文本而不是将其作为shell变量插入。 从。*删除了转义,因为不需要。 从cut命令中删除了转义,因为不需要。 顺便说一句,这也可以工作:
dbuser=`grep \'$dbuser\' config.php.inc | grep -Po \"\\\'.*\\\'\" | cut -d \\\' -f 2`
此外,$(command)语法通常是最好的方法。仅在出于可移植性原因而必须使用``的情况下,如果您必须支持绝对不支持$(command)的平台。恕我直言,这非常罕见,因此经验法则是从一开始就倾向于$(command)。     ,        听起来好像缺少\\ 检查这是否不是\\\\ $ dbuser 如果您有权访问perl 尝试:
dbuser=$(perl -ne \"print \\$1 if /\\$dbuser.*\'(.*)\'/\" config.php.inc)
注意 :  -e使用下一个参数作为一个内衬脚本  -n使用所有参数作为文件参数  打印$ 1匹配时打印匹配的模式  正则表达式中的反义词定义了$ 1捕获组。     ,        具有一些基本检查和安全性
eval $(sed -n \"s/^\\$\\([a-zA-Z][a-zA-Z0-9_]*\\) *= *\'\\(.*\\)\' *;/\\1=\'\\2\';/p\")
echo User:$dbuser Pass:$dppass Host:$dhhost
将为您的示例打印
User:fred Pass:abc123 Host:127.0.0.1
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。