2013-03-12 15 views
10

シェルスクリプトを使用してキーで値を検索する必要があるファイルがあります。 「これが値である」シェルスクリプトからファイル内のキー/値を解析するコード

MyVar=Get HereIsAKey 

、その後のMyVarが等しくなければならない:

HereIsAKey This is the value 

がどのように私のような何かを行うことができます。ファイルは次のようになります。キーには空白がなく、値はキーの後の空白に続くすべての値でなければなりません。

答えて

15

HereIsAKeyがあなたのファイルに一意である場合、grepのでこれを試してみてください。

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

素晴らしい! 1つの質問は私がスクリプトに慣れているからです。私はGetConfigValueのような関数を必要とし、パラメータとしてHereIsAKeyをとります。渡されたパラメータを正規表現にどのように入れることができますか? –

+0

これは問題ありません:echo "(grep -Po \"(?<=^"" $ 1 "")。* \ "ファイル)"ですが、変数に代入するのに問題があります。 MyParam:コマンドが見つかりません。 –

+0

気にしないでください。それを得ました:REGEXP = "grep -Po \"(?<=^$ {1})。* \ "ファイル" –

4

ファイルがソートされていない場合には、検索が遅くなります。

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

ファイルがソートされている場合は、Aのみで一つの変数が必要な場合は、

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

それはCentOSの5で正常に動作します! –

+0

"Lookユーティリティはバージョン7のAT&T Unixに登場しました。" – hagello

5

で速い検索を得ることができますあなたは次のようなことをすることができます:

#!/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

+0

代入の解が見つかりました –

+1

これは本当に不必要に冗長な修正です。あなたの既存の 'while read'ループをとり、最初に' cat file'の代わりに '

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読み取りファイル内の各行に変数__property_...を設定したconfig.propertiesファイルから、get_propは、ロードされたプロパティに基づいて変数の設定を許可します。それは必要とされるほとんどの場合に有効です。

はい、私はそれにの安全ではないが、それはそれが私がそれに必要なもののために働くことを意味する評価がそこにあることを認識します。

0
get() { 
    while read -r key value; do 
     if [ "$key" = "$1" ]; then 
      echo "$value" 
      return 0 
     fi 
    done 
    return 1 
} 

2つのreturn文は厳密には必要ではありませんが、特定のキーを見つける際の成功または失敗を示す良い終了コードを提供します。また、「キーに空の文字列があります」と「キーが見つからない」の区別に役立ちます。

4

あなたはPerl互換の正規表現をサポートしていますグレップをお持ちでない場合は、次のように動作しているようです:

VAR=$(grep "^$KEY " file | cut -d' ' -f2-) 
+0

これは読みやすく、移植性が高いだけでなく、 equalsを切り捨てると変数の空白のサイズも扱えます: 'grep"^$ KEY "$ FILE | cut -d '=' -f2-' – 7yl4r

関連する問題