从shell脚本解析文件中的键/值的代码
我有一个文件,需要使用shell脚本通过键查找值。该文件看起来像:从shell脚本解析文件中的键/值的代码
HereIsAKey This is the value
我怎么可以这样做:
MyVar=Get HereIsAKey
然后MyVar的应该等于“这就是价值。”密钥没有空格,值应该是密钥后面的空格。
如果HereIsAKey
在文件中是独一无二的,试试这个使用grep:
myVar=$(grep -Po "(?<=^HereIsAKey).*" file)
如果文件不排序,查找将是缓慢的:
my_var=$(awk '/^HereIsAKey/ { $1=""; print $0; exit}' value-file)
如果文件进行排序,你可以得到
my_var=$(look HereIsAkey value-file | cut -d ' ' -f 2-)
它工作正常在CentOS 5! – 2014-04-11 21:34:50
“外观工具出现在AT&T Unix版本7中。” – hagello 2016-06-29 13:26:02
更快的查找如果你只需要一个变量在时间,你可以这样做:
#!/bin/bash
cat file | while read key value; do
echo $key
echo $value
done
这个解决方案的问题:变量只是有效的我在循环之前。所以不要试图做$key=$value
并在循环之后使用它。
更新:另一种方式是I/O重定向:
exec 3<file
while read -u3 key value; do
eval "$key='$value'"
done
exec 3<&-
echo "$keyInFile1"
echo "$anotherKey"
作业的左侧不能是参数扩展 – chepner 2013-03-12 17:08:33
找到了作业的解决方案 – 2013-03-13 12:25:25
这是一个非常不必要的详细修复。只需要使用现有的'while read'循环,在开始处将'
我使用跨共享的属性文件多种语言,我使用一对功能:
load_properties() {
local aline= var= value=
for file in config.properties; do
[ -f $file ] || continue
while read aline; do
aline=${aline//\#*/}
[[ -z $aline ]] && continue
read var value <<<$aline
[[ -z $var ]] && continue
eval __property_$var=\"$value\"
# You can remove the next line if you don't need them exported to subshells
export __property_$var
done <$file
done
}
get_prop() {
local var=$1 key=$2
eval $var=\"\$__property_$key\"
}
load_properties
reads从config.properties
文件为文件中的每一行填充一组变量__property_...
,然后get_prop允许基于加载的属性设置变量。它适用于大多数需要的情况。
是的,我意识到有一个eval在那里,这使得它不安全的用户输入,但它适用于我需要它做。
get() {
while read -r key value; do
if [ "$key" = "$1" ]; then
echo "$value"
return 0
fi
done
return 1
}
这两个返回语句不是绝对必要的,但提供了很好的退出代码来指示找到给定键时的成功或失败。它们还可以帮助区分“密钥具有空值字符串”和“未找到密钥”。
如果您还没有支持Perl兼容的正则表达式的grep,下面似乎工作:
VAR=$(grep "^$KEY " file | cut -d' ' -f2-)
这不仅是更具可读性和便携性,它可以如果你在等于:'grep“^ $ KEY”$ FILE |“上切换,也会处理可变的空白大小cut -d'='-f2-' – 7yl4r 2017-10-04 17:17:57
太棒了!一个我不熟悉脚本的问题。我想要一个像GetConfigValue这样的函数,它将把HereIsAKey作为参数。我怎样才能把传入的参数放入正则表达式中? – 2013-03-12 16:49:47
这很好:echo“(grep -Po \”(? 2013-03-12 17:34:24
没关系。知道了:REGEXP =“grep -Po \”(? 2013-03-12 18:01:21