複数の文字を区切り文字として使用して文字列を分割するためのZSH構文

複数の文字を区切り文字として使用して文字列を分割するためのZSH構文

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 は次のように分割されます。$=var1:

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 -Eneeneprint:(print -r -- $fileまたはprint -r - $file)。さらに重要なことは、より多くのオプションがサポートされていることを忘れないでください。--その一部は危険です。-printprint


1参考にしてくださいこれは、引用符で囲まれていない引数を拡張するときにデフォルトで他のBourne様シェルが実行することの1つです。、しばしばエラー機能と見なされます(そして危険なもの!)。 zshでは、$=varワイルドカードを明示的に要求するように明示的に分割を要求する必要があります(他のシェルで引用されていない拡張でも行われます!)$~var(または$=~varその両方)。

関連情報