Bash

將字元串從 var1 映射到 var2(查找)

  • June 11, 2018

VAR2我想根據 VAR1 的內容進行不區分大小寫的查找,其中包含以下形式的一些參數keyvalue。如果VAR1 key存在 a,則替換 VAR2 中的值。

例如:

VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom

我希望結果是:

VAR3='viki','albert','rich'

VAR1可以為空。

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'

awk(您可以與zsh或任何類似 Bourne 的 shell一起使用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
}'

(一個區別是這裡我們只將值括在單引號內。如果值本身包含單引號,例如foo'bar,你會得到'foo'bar'while zsh’s${(qq)var}會給你'foo'\''bar')。

zsh版本允許項目的任何值。它們可以包含任何字節值,包括換行符和 NUL 或空值。一個awk不支持 NUL,因為它們不能儲存在環境變數中,並且根據實現可能會阻塞包含不形成有效字元的字節的項目。

請注意,兩者都VAR2=被理解為空列表,而VAR2=,被理解為 2 個空元素的列表,無法表示一個空元素的列表。

引用自:https://unix.stackexchange.com/questions/449097