次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=,
リストを表現する方法はありません。