var1からvar2への文字列マッピング(検索)

var1からvar2への文字列マッピング(検索)

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できます)。zshbash

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'barwhile'foo'bar'が提供zshされます。)${(qq)var}'foo'\''bar'

このzshバージョンでは、アイテムのすべての値を受け入れます。改行、NUL、またはnull値を含む任意のバイト値を含めることができます。awkNULは環境変数に格納できず、実装によっては有効な文字を形成しないバイトを含むエントリをブロックする可能性があるため、このバージョンではNULをサポートしません。

VAR2=空のリストとして理解されるものと、2つの空の要素で構成されるリストとして理解される両方の場合、空の要素のVAR2=,リストを表現する方法はありません。

おすすめ記事