web-dev-qa-db-ja.com

Zshの配列からすべての空の文字列を削除します

Zsh配列からすべての空の文字列を削除するにはどうすればよいですか?

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

出力する必要がありますa/b/c

8
Jay

配列の要素で機能するパラメータ拡張${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)フラグを使用して、一致しない要素を削除します)。

12
guest

まあ、zshには:|array減算用のパラメーター拡張演算子-つまり、空の要素のみで構成される2番目の配列を定義するのが難しい方法です

b=('')

そして次に

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

a/b/c

ただし、追加の配列なしでそれを行う方法であるoughtのように感じます

...そして確かに あり です。

7
steeldriver

これは、パラメータ展開を引用符で囲まないでおくと、デフォルトでzshが行うことです¹。

そう:

_a=($a)
_

_$a_配列の空の要素を削除します。


¹ 私は一般的に、機能が間違っていると考えています 。それを行わないより良い配列については、rc/esまたはfishシェルを参照してください。 ksh/bashのスパース配列とのある程度の互換性を提供するために、おそらくそこにあります。 ksh/bash配列は、引用符で囲まれていない配列の展開時に空の削除を行うだけでなく(_${a[@]}_と記述されています)、split + globもあり、引用符で囲まれていない配列は実際には使用できませんグロビングを無効にし、_$IFS_を空の文字列に設定しない限り(IFS=; set -o noglob; a=(${a[@]})は、配列を非スパースにすることに加えて、zshのようにそこでのみ空の削除を行います)

5