次VAR2
の形式のいくつかのパラメータを使用して、VAR1の内容に基づいて大文字と小文字を区別しないクエリを実行したいと思いますkey
。存在するvalue
場合、VAR2の値を置き換えます。VAR1
key
たとえば、
VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom
私が望む結果は次のとおりです。
VAR3='viki','albert','rich'
VAR1
空になる可能性があります。
答え1
そしてzsh
:
VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom
typeset -A map
for i ("${(@s(,))VAR1}") map[${(L)i%%:*}]=${i#*:}
out=()
for i ("${(@s(,))VAR2}") out+=${(qq)${map[${(L)i}]:-$i}}
VAR3=${(j(,))out}
printf '%s\n' "$VAR3"
出力:
'viki','albert','rich'
次のものと同じです(たとえば、Bourneに似たシェルで使用awk
できます)。zsh
bash
VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom
export VAR1 VAR2
awk -v q=\' 'BEGIN {
n = split(ENVIRON["VAR1"], a, ",")
for (i = 1; i <= n; i++) {
k = v = a[i]
sub(/:.*/, "", k)
sub(/[^:]*:/, "", v)
map[tolower(k)] = v
}
n = split(ENVIRON["VAR2"], a, ",")
for (i = 1; i <= n; i++) {
k = tolower(a[i])
out = out sep q (k in map ? map[k] : a[i]) q
sep = ","
}
print out
}'
(1つの違いは、ここでは値を一重引用符で囲むだけです。たとえば、値自体に一重引用符が含まれている場合はfoo'bar
while'foo'bar'
が提供zsh
されます。)${(qq)var}
'foo'\''bar'
このzsh
バージョンでは、アイテムのすべての値を受け入れます。改行、NUL、またはnull値を含む任意のバイト値を含めることができます。awk
NULは環境変数に格納できず、実装によっては有効な文字を形成しないバイトを含むエントリをブロックする可能性があるため、このバージョンではNULをサポートしません。
VAR2=
空のリストとして理解されるものと、2つの空の要素で構成されるリストとして理解される両方の場合、空の要素のVAR2=,
リストを表現する方法はありません。
答え2
(レコード区切り記号)awk
に基づいて使用:RS
VAR3=$(awk '
BEGIN{RS="[,\n]";FS=":";ORS=","}
NR==FNR{a[tolower($1)]=$2}
NR>FNR{printf "%s\047%s\047",(FNR>1?ORS:""),(a[$1]?a[$1]:$1)}
' <(echo "$VAR1") <(echo "$VAR2")
)
配列はキーと値のペアの内容でa
埋められます。VAR1
この変数は2番目の変数を解析するために使用され、配列項目がある場合は値が置き換えられます。
答え3
bash
小文字キーと関連値を使用してテーブル(関連付け配列)を構築する(4.0+)ソリューションです。次に、ルックアップテーブルの値を繰り返してルックアップテーブルの値を使用するか、ルックアップテーブルに現在の文字列に対応するキーがない場合はビルドします。lookup
VAR1
VAR2
VAR3
VAR2
VAR2
VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom
declare -A lookup
# build lookup table
while read -d , key_value; do
# $key_value is a string like "tom:rich", separate these into key and value:
IFS=: read key value <<<"$key_value"
# add lower-cased key to table with value
lookup[${key,,}]=$value
done <<<"$VAR1,"
# do lookups in table
while read -d , string; do
# get newstring from table, but use $string if there's no entry:
newstring=${lookup[${string,,}]:-$string}
# add $newstring to VAR3, with a delimiting comma unless VAR3 is empty
VAR3+="${VAR3:+,}'$newstring'"
done <<<"$VAR2,"
printf 'VAR3 = %s\n' "$VAR3"
このコードは以下を出力します。
VAR3 = 'viki','albert','rich'
VAR1
これは、合計の値にVAR2
改行文字が含まれていないと仮定します。