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 が配列の場合、一致する配列要素が削除されます。(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には:|
パラメータ拡散演算子があります。大量に減算 - 空の要素のみを含む2番目の配列を定義するのは不器用なアプローチです。
b=('')
それから
% echo ${(j./.)a:|b}
a/b/c
それでもそこにいるようです。しなければならない追加の配列なしでこれを行う方法です。
...本当に持つ。