com 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"
Saída:
'viki','albert','rich'
Mesmo com awk
(que você pode usar com zsh
ou qualquer shell semelhante a Bourne como 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
}'
(uma diferença é que aqui só colocamos os valores dentro de aspas simples. Se o valor contiver aspas simples, como foo'bar
, você receberá 'foo'bar'
, enquanto zsh
${(qq)var}
dará 'foo'\''bar'
).
A versão zsh
permite qualquer valor para os itens. Eles podem conter qualquer valor de byte, incluindo newline e NUL, ou um valor vazio. O awk
one não suportará NULs, já que elas não podem ser armazenadas em variáveis de ambiente e, dependendo da implementação, podem sufocar itens contendo bytes que não formam caracteres válidos.
Observe que, com ambos, VAR2=
é entendido como uma lista vazia, enquanto VAR2=,
é entendido como uma lista de dois elementos vazios, não há como expressar uma lista de um elemento vazio.