如何解决用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 举报,一经查实,本站将立刻删除。