ZSHに組み込まれている分割演算子を使用して、この操作を実行する正しい構文を見つけることはできません。https://zsh.sourceforge.io/Guide/zshguide05.html
これはうまくいきますが、echo / sedを削除しようとしています。
for i in *;
do f=$(echo $i | sed 's/[-.]/ /g');
parts=(${(s: :)f}); echo $parts[1]; done
式で文字セットを指定する方法はparts=(${(s: :)f});
?
入力文字列の最初の英数字の部分文字列を見つけようとしています。
答え1
これs[sep]
パラメータ拡張フラグパターンではなく文字列(単一文字である必要はありません)のみが許可されます。
s
次の方法で複数の演算子を結合できます。入れ子になった拡張:
for file in *(N); do
parts=( ${(@s[-])${(s[.])file}} )
print -r The first part is $parts[1]
done
(また参考にしてください(N)
グローバル予選現在の作業ディレクトリに隠されていないファイルがない場合にエラーを防ぐために)。
またはあなたは使用することができますIFS は次のように分割されます。$=var
1:
IFS=.-
parts=( $=file )
parts=( ${(s[.])string} )
は空の要素を削除しますが、後で削除したり匿名関数を使用したりするIFS=.; parts=( $=string )
ことはできますが、そうではありません。parts=($=string); parts=($string)
(){ parts=($@); } $=string
または、すべての文字を1に置き換えてIFS分割を使用して分割する場合は、kshスタイルまたはcshスタイルをs[sep]
使用できます(使用${param//pattern/replacement}
histsubstpattern
存在する) $param:gs/pattern/replacement/
:
parts=( ${(s[.])file//[-...]/.} )
これが必要な最初の部分である場合は、次のことができます。
first_part=${file%%[.-]*}
kshの構文は80年代の構文と同じです。
1つ以上のalnumの最初のシーケンスの場合:
set -o extendedglob
first_sequence_of_alnums=${(MS)file##[[:alnum:]]##}
または
if [[ $file =~ [[:alnum:]]+ ]]; then
first_sequence_of_alnums=$MATCH
else
print -ru2 "There are no alnums in $file"
fi
または:
alnum_sequences=( ${(s[:])file//[^[:alnum:]]/:} )
if (( $#alnum_sequences > 0 )); then
first_sequence_of_alnums=$alnum_sequences[1]
else
print -ru2 "There are no alnums in $file"
fi
とにかくぜひ使うべきならecho
、これはおそらく
echo -E - $file
そうしないと、-E
バックスラッシュが$file
壊れる可能性があります。それ以外の場合、次の-
値には機能しません。$file
-n
-Eneene
print
:(print -r -- $file
またはprint -r - $file
)。さらに重要なことは、より多くのオプションがサポートされていることを忘れないでください。--
その一部は危険です。-
print
print
1参考にしてくださいこれは、引用符で囲まれていない引数を拡張するときにデフォルトで他のBourne様シェルが実行することの1つです。、しばしばエラー機能と見なされます(そして危険なもの!)。 zshでは、$=var
ワイルドカードを明示的に要求するように明示的に分割を要求する必要があります(他のシェルで引用されていない拡張でも行われます!)$~var
(または$=~var
その両方)。