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 제거를 수행하십시오 )$IFS
IFS=; set -o noglob; a=(${a[@]})
zsh
답변3
음, zsh에는 :|
매개변수 확산 연산자 가 있습니다.대량으로빼기 - 빈 요소만 포함하는 두 번째 배열을 정의하는 것은 서투른 접근 방식입니다.
b=('')
그럼 해
% echo ${(j./.)a:|b}
a/b/c
그래도 거기 있는 것 같아~해야 한다추가 배열 없이 이를 수행하는 방법입니다.
...정말가지다.