Bash
將字元串從 var1 映射到 var2(查找)
VAR2
我想根據 VAR1 的內容進行不區分大小寫的查找,其中包含以下形式的一些參數key
:value
。如果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'
whilezsh
’s${(qq)var}
會給你'foo'\''bar'
)。該
zsh
版本允許項目的任何值。它們可以包含任何字節值,包括換行符和 NUL 或空值。一個awk
不支持 NUL,因為它們不能儲存在環境變數中,並且根據實現可能會阻塞包含不形成有效字元的字節的項目。請注意,兩者都
VAR2=
被理解為空列表,而VAR2=,
被理解為 2 個空元素的列表,無法表示一個空元素的列表。