다음 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
}'
(한 가지 차이점은 여기서는 값을 작은따옴표로만 묶는다는 것입니다. 예를 들어 값 자체에 작은따옴표가 포함되어 있으면 foo'bar
while 'foo'bar'
이 제공 zsh
됩니다 .)${(qq)var}
'foo'\''bar'
이 zsh
버전에서는 항목에 대한 모든 값을 허용합니다. 줄 바꿈, NUL 또는 null 값을 포함하여 모든 바이트 값을 포함할 수 있습니다. awk
NUL은 환경 변수에 저장될 수 없으며 구현에 따라 유효한 문자를 형성하지 않는 바이트가 포함된 항목을 차단할 수 있으므로 이 버전에서는 NUL을 지원하지 않습니다.
VAR2=
빈 목록으로 이해되는 것과 2개의 빈 요소로 구성된 목록으로 이해되는 두 경우 모두 VAR2=,
빈 요소 목록을 표현할 수 있는 방법이 없습니다.
답변2
(레코드 구분 기호)을 awk
기준으로 사용 :RS
VAR3=$(awk '
BEGIN{RS="[,\n]";FS=":";ORS=","}
NR==FNR{a[tolower($1)]=$2}
NR>FNR{printf "%s\047%s\047",(FNR>1?ORS:""),(a[$1]?a[$1]:$1)}
' <(echo "$VAR1") <(echo "$VAR2")
)
배열 은 키와 값 쌍의 내용으로 a
채워집니다 . VAR1
이 변수는 두 번째 변수를 구문 분석할 때 사용되며 배열 항목이 있으면 값이 대체됩니다.
답변3
bash
소문자 키와 관련 값을 사용하여 테이블(연관 배열)을 구축하는 (4.0+) 솔루션입니다 . 그런 다음 조회 테이블의 값을 반복하여 조회 테이블의 값을 사용하거나 조회 테이블에 현재 문자열에 해당하는 키가 없는 경우 빌드합니다.lookup
VAR1
VAR2
VAR3
VAR2
VAR2
VAR1=tom:rich,LIAm:viki
VAR2=liam,albert,tom
declare -A lookup
# build lookup table
while read -d , key_value; do
# $key_value is a string like "tom:rich", separate these into key and value:
IFS=: read key value <<<"$key_value"
# add lower-cased key to table with value
lookup[${key,,}]=$value
done <<<"$VAR1,"
# do lookups in table
while read -d , string; do
# get newstring from table, but use $string if there's no entry:
newstring=${lookup[${string,,}]:-$string}
# add $newstring to VAR3, with a delimiting comma unless VAR3 is empty
VAR3+="${VAR3:+,}'$newstring'"
done <<<"$VAR2,"
printf 'VAR3 = %s\n' "$VAR3"
이 코드는 다음을 출력합니다.
VAR3 = 'viki','albert','rich'
VAR1
이는 합계의 값에 VAR2
개행 문자가 포함되어 있지 않다고 가정합니다.