16

我有一个文件,我需要使用 shell 脚本按键查找值。该文件如下所示:

HereIsAKey This is the value

我该怎么做:

MyVar=Get HereIsAKey

然后 MyVar 应该等于“这是值”。键没有空格,值应该是键后空格后面的所有内容。

4

6 回答 6

22

如果HereIsAKey在您的文件中是唯一的,请使用 grep 尝试此操作:

myVar=$(grep -Po "(?<=^HereIsAKey ).*" file)
于 2013-03-12T16:01:03.827 回答
8

如果您没有支持与 Perl 兼容的正则表达式的 grep,则以下方法似乎有效:

VAR=$(grep "^$KEY " file | cut -d' ' -f2-)
于 2014-09-30T10:58:32.787 回答
7

如果您一次只需要一个变量,您可以执行以下操作:

#!/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"
于 2013-03-12T15:57:41.660 回答
4

如果文件未排序,查找会很慢:

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

如果文件已排序,您可以使用

my_var=$( look HereIsAkey value-file | cut -d ' ' -f 2- )
于 2013-03-12T15:57:22.287 回答
0

我使用跨多种语言共享的属性文件,我使用了一对函数:

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从文件中读取为config.properties文件中的每一行填充一组变量__property_...,然后 get_prop 允许根据加载的属性设置变量。它适用于大多数需要的情况。

是的,我确实意识到那里有一个 eval ,这使得用户输入不安全,但它适用于我需要它做的事情。

于 2013-03-12T16:10:51.287 回答
0
get () {
    while read -r key value; do
        if [ "$key" = "$1" ]; then
            echo "$value"
            return 0
        fi
    done
    return 1
}

这两个 return 语句不是绝对必要的,但提供了很好的退出代码来指示找到给定键的成功或失败。它们还可以帮助区分“键的值是空字符串”和“找不到键”。

于 2013-03-12T17:09:48.583 回答