変数リストで項目を検索する最良の方法

変数リストで項目を検索する最良の方法

demo.cfg多くの変数を含む「」というファイルがあります。

$VARIABLE_good="milk bread butter water"
$VARIABLE_bad="beer drugs"
$CONTENT_to_buy="Towel mouse bottle glass pen earphones"
$DUMMYVAR_mixed="drugs water bottle glass"

ファイル全体で「drugs」項目を検索し、その項目が属する項目を識別したいと思います$VARIABLE_bad

$VARIABLE_badasbad$VARIABLE_goodas good$CONTENT_to_buyas to_buy$DUMMYVAR_mixedasmixedなどを割り当てたいです。

このファイルから ""を検索すると、drugs必要な出力は次のようになります。

mixed
bad

将来的には上記の変数が増える可能性があるため、この問題を解決するための柔軟な方法が必要です。

私は試した:

. demo.cfg "drugs"(これを行うと、すべての変数がエクスポートされます)

if [[ $(echo $DUMMYVAR_mixed | grep "drugs") ]]; then echo "mixed"; fi
if [[ $(echo $DUMMYVAR_to_buy | grep "drugs") ]]; then echo "to_buy"; fi
if [[ $(echo $VARIABLE_bad | grep "drugs") ]]; then echo "bad"; fi
if [[ $(echo $VARIABLE_good | grep "drugs") ]]; then echo "good"; fi

しかし、これは冗長に見え、それほど柔軟には見えません。より良い解決策はありますか?

ベストアンサー1

これは、行に1つしかない小さな場合awkにのみ必要です。=

awk -vpat=drugs -F= '$2 ~ pat {gsub(/^\$[A-Z]+_/, "", $1); print $1; }' demo.cfg

-vpat=...一致に使用する変数を区切り、2番目のフィールドのフィールドと一致させ、最初のフィールドの最初の-F=部分を空の文字列に置き換えます。次に、最初のフィールドを印刷します。 (最初の部分の下線の前には大文字のみがあると仮定します。)=$2 ~gsub$1


値に等号を含めることができる場合は、次のように、等号の後にキーワードが続く行全体を検索できます。

awk -vpat=drugs -F= '$0 ~ ("=.*" pat) {gsub(/^\$[A-Z]+_/, "", $1); print $1; }' demo.cfg

あるいは、2つの部分を手動で分割すると、時間が少し長くなります。


demo.cfgなどのドル記号を持つ割り当てを含めると、シェルは$VARIABLE_good="milk bread butter water"その割り当てを取得できません。

$ . demo.cfg
-bash: =milk bread butter water: command not found

割り当てには変数名のみが使用され、ドル記号は変数拡張時にのみ使用されます。

おすすめ記事