zshパラメーターを拡張するときは、文字列の先頭から一致する項目の数を削除してください。

zshパラメーターを拡張するときは、文字列の先頭から一致する項目の数を削除してください。

パラメーター拡張を使用すると、次の先行スペースを削除できます。

stripped_var=${original_var#[[:blank:]]}

##最小一致ではなく最大一致を許可することに慣れています#が、パターンを「空白1つ」から「空白数」に変換する方法が見つかりませんでした。

値からすべての先行スペースを削除するために複数の一致を許可する方法はありますかoriginal_var?理想的には、サブプロセス/サブシェルの起動を含まないソリューションを探しています。つまり、awk、sedなどのないソリューションを好むがパラメータ拡張がトリックを実行できない場合はそれもそうです)

答え1

使用できる拡張グローバル演算子 x#:

x#
(設定にはEXTENDED_GLOBが必要です。)パターンxが0個以上一致します。この演算子は優先順位が高いです。 「12#」は「(12)#」ではなく「1(2#)」と同じです。繰り返すことができない項目の後に引用符がない '#'はエラーです。これには、KSH_GLOBパターンの一部である場合は空の文字列、パターンの後に「##」、または括弧が含まれます(例:「!(foo)#」)。無効で、 '*(!(foo)) ') に置き換える必要があります。

setopt extended_glob
stripped_var=${original_var##[[:blank:]]#}

答え2

〜のように@フレディが言及されています、このパターンはregexp'sまたは'sと同じようにzsh使用できます。[[:blank:]]#[[:blank:]]*ksh*([[:blank:]])

しかし、POSIXlyでは、次のようにすることもできます。

stripped_var=${orginal_var#"${original_var%%[![:blank:]]*}"}

同等の場合awk '{$1=$1};1'、つまり先行スペースと末尾のスペースを削除し、スペースシーケンスを単一のスペースに圧縮すると、次のことができます。

var=$'  a    b\tc\t\td\t \n\n'
stripped_var=${${=var}}

(ここでは$stripped_varとなります"a b c d")。つまり、$IFS分割を実行して再びスカラーに変換して、要素をの最初の文字に関連付けます$IFS

関連情報