Zsh의 배열에서 빈 문자열을 모두 제거합니다.

Zsh의 배열에서 빈 문자열을 모두 제거합니다.

Zsh 배열에서 빈 문자열을 모두 제거하는 방법은 무엇입니까?

a=('a' '' 'b' 'c')
# remove empty elements from array
echo ${(j./.)a}

출력해야 한다a/b/c

답변1

${name:#pattern}배열의 요소에 작용하는 매개변수 확장(모드는 비어 있을 수 있음)이 있습니다 .

a=('a' '' 'b' 'c')
echo ${(j./.)a:#}
# If the expansion is in double quotes, add the @ flag:
echo "${(@j./.)a:#}"

man 1 zshexpn:

${name:#pattern}패턴이 name 값과 일치하면 빈 문자열로 바꾸고, 그렇지 않으면 간단히 name 값을 바꿉니다. name이 배열이면 일치하는 배열 요소가 제거됩니다. (M)일치하지 않는 요소를 제거하려면 이 플래그를 사용하세요.

답변2

이는 zsh인용되지 않은 인수가 확장될 때 기본적으로 수행되는 작업입니다.

그래서:

a=($a)

배열의 빈 요소는 제거됩니다 $a.


^나는 일반적으로 이것이 버그 특성이라고 생각합니다.. 이를 수행하지 않는 더 나은 배열에 대해서는 rc/ es또는 쉘을 참조하십시오 . fish이는 아마도 ksh/sparse 배열과 어느 정도의 호환성을 제공하기 위한 것입니다 bash. ksh/ bash배열은 따옴표가 없는 배열 확장(거기에 기록됨)에서 null 삭제를 수행할 뿐만 아니라 분할+glob도 수행합니다. 즉, 와일드카드를 비활성화하고 null 문자 문자열로 ${a[@]}설정하지 않는 한 따옴표가 없는 배열을 실제로 사용할 수 없음을 의미합니다. 이와 같이 배열을 희소하지 않게 만드는 것 외에 여기서 null 제거를 수행하십시오 )$IFSIFS=; set -o noglob; a=(${a[@]})zsh

답변3

음, zsh에는 :|매개변수 확산 연산자 가 있습니다.대량으로빼기 - 빈 요소만 포함하는 두 번째 배열을 정의하는 것은 서투른 접근 방식입니다.

b=('')

그럼 해

 % echo ${(j./.)a:|b}

a/b/c

그래도 거기 있는 것 같아~해야 한다추가 배열 없이 이를 수행하는 방법입니다.

...정말가지다.

관련 정보