从shell脚本解析文件中的键/值的代码

问题描述:

我有一个文件,需要使用shell脚本通过键查找值。该文件看起来像:从shell脚本解析文件中的键/值的代码

HereIsAKey This is the value 

我怎么可以这样做:

MyVar=Get HereIsAKey 

然后MyVar的应该等于“这就是价值。”密钥没有空格,值应该是密钥后面的空格。

如果HereIsAKey在文件中是独一无二的,试试这个使用grep:

myVar=$(grep -Po "(?<=^HereIsAKey).*" file) 
+0

太棒了!一个我不熟悉脚本的问题。我想要一个像GetConfigValue这样的函数,它将把HereIsAKey作为参数。我怎样才能把传入的参数放入正则表达式中? – 2013-03-12 16:49:47

+0

这很好:echo“(grep -Po \”(? 2013-03-12 17:34:24

+0

没关系。知道了:REGEXP =“grep -Po \”(? 2013-03-12 18:01:21

如果文件不排序,查找将是缓慢的:

my_var=$(awk '/^HereIsAKey/ { $1=""; print $0; exit}' value-file) 

如果文件进行排序,你可以得到

my_var=$(look HereIsAkey value-file | cut -d ' ' -f 2-) 
+0

它工作正常在CentOS 5! – 2014-04-11 21:34:50

+0

“外观工具出现在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" 
+0

作业的左侧不能是参数扩展 – chepner 2013-03-12 17:08:33

+0

找到了作业的解决方案 – 2013-03-13 12:25:25

+1

这是一个非常不必要的详细修复。只需要使用现有的'while read'循环,在开始处将' 2017-03-13 14:42:12

我使用跨共享的属性文件多种语言,我使用一对功能:

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-) 
+0

这不仅是更具可读性和便携性,它可以如果你在等于:'grep“^ $ KEY”$ FILE |“上切换,也会处理可变的空白大小cut -d'='-f2-' – 7yl4r 2017-10-04 17:17:57