パラメーター拡張を使用すると、次の先行スペースを削除できます。
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
。