16

シェルスクリプトを使用してキーで値を検索する必要があるファイルがあります。ファイルは次のようになります。

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

一度に1つの変数のみが必要な場合は、次のように実行できます。

#!/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
get () {
    while read -r key value; do
        if [ "$key" = "$1" ]; then
            echo "$value"
            return 0
        fi
    done
    return 1
}

2つのreturnステートメントは厳密には必要ありませんが、指定されたキーの検索の成功または失敗を示すための適切な終了コードを提供します。また、「キーの値に空の文字列がある」と「キーが見つかりませんでした」を区別するのにも役立ちます。

于 2013-03-12T17:09:48.583 に答える
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_propertiesconfig.propertiesget_prop は、ファイルの各行に一連の変数を設定するファイルから読み取り__property_...ます。その後、get_prop は、読み込まれたプロパティに基づいて変数を設定できるようにします。必要なほとんどの場合に機能します。

はい、そこに eval があることは認識しています。これにより、ユーザー入力に対して安全ではなくなりますが、必要なことには機能します。

于 2013-03-12T16:10:51.287 に答える