首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Shell脚本读取包含句点字符的键的.properties文件

如何使用Shell脚本读取包含句点字符的键的.properties文件
EN

Stack Overflow用户
提问于 2015-03-03 19:05:39
回答 3查看 134.1K关注 0票数 58

我正在尝试从包含句点(.)的shell脚本读取属性文件。字符如下:

代码语言:javascript
复制
# app.properties
db.uat.user=saple user
db.uat.passwd=secret


#/bin/sh
function pause(){
   read -p "$*"
}

file="./app.properties"

if [ -f "$file" ]
then
    echo "$file found."
 . $file

echo "User Id " $db.uat.user
echo "user password =" $db.uat.passwd
else
    echo "$file not found."
fi

我试图在源文件之后解析文件,但它不工作,因为关键字包含“。字符,并且该值中也有空格。

我的属性文件始终驻留在脚本的同一目录中或/usr/share/doc中的某个位置

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-03 20:07:16

因为(Bourne) shell变量不能包含点,所以可以用下划线替换它们。每一行都读一遍,翻译一下。在关键字_和评估中。

代码语言:javascript
复制
#/bin/sh

file="./app.properties"

if [ -f "$file" ]
then
  echo "$file found."

  while IFS='=' read -r key value
  do
    key=$(echo $key | tr '.' '_')
    eval ${key}=\${value}
  done < "$file"

  echo "User Id       = " ${db_uat_user}
  echo "user password = " ${db_uat_passwd}
else
  echo "$file not found."
fi

请注意,以上内容仅用于翻译。对于_,如果你有一个更复杂的格式,你可能想要使用额外的翻译。我最近不得不解析一个包含许多讨厌字符的完整Ant属性文件,在那里我不得不使用:

代码语言:javascript
复制
key=$(echo $key | tr .-/ _ | tr -cd 'A-Za-z0-9_')
票数 58
EN

Stack Overflow用户

发布于 2015-03-04 22:15:57

@fork2x

我已经尝试过这样的.Please评论,并更新我,无论它是不是正确的方法。

代码语言:javascript
复制
#/bin/sh
function pause(){
   read -p "$*"
}

file="./apptest.properties"


if [ -f "$file" ]
then
    echo "$file found."

dbUser=`sed '/^\#/d' $file | grep 'db.uat.user'  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'`
dbPass=`sed '/^\#/d' $file | grep 'db.uat.passwd'  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'`

echo database user = $dbUser
echo database pass = $dbPass

else
    echo "$file not found."
fi
票数 1
EN

Stack Overflow用户

发布于 2017-04-07 02:35:26

我发现使用while IFS='=' read -r有点慢(我不知道为什么,也许有人可以在评论中简短地解释一下,或者指向一个这样的答案?)我还发现@Nicolai answer作为一行程序非常简洁,但效率非常低,因为它会一遍又一遍地扫描整个属性文件,以获取prop的每一个调用。

我找到了一个解决方案,它回答了这个问题,执行得很好,而且它是一行(虽然有点冗长)。

该解决方案进行寻源,但在寻源之前对内容进行了修改:

代码语言:javascript
复制
#!/usr/bin/env bash

source <(grep -v '^ *#' ./app.properties | grep '[^ ] *=' | awk '{split($0,a,"="); print gensub(/\./, "_", "g", a[1]) "=" a[2]}')

echo $db_uat_user

解释:

grep -v '^ *#':丢弃注释行grep '[^ ] *=':丢弃没有=的行split($0,a,"="):在=处拆分行并存储到数组a中,即a1是关键字,a2是值gensub(/\./, "_", "g", a[1]):将.替换为_ print gensub... "=" a[2]}将上面gensub的结果与=和value连接起来。

编辑:正如其他人指出的,存在一些不兼容问题(awk),而且它不会验证内容以查看属性文件的每一行是否真的是kv对。但这里的目标是展示既快速又干净的解决方案的总体思路。采购似乎是可行的方法,因为它只需加载一次可多次使用的属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28830225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档