文字列を区切り文字に分割してN番目の要素を取得する

文字列を区切り文字に分割してN番目の要素を取得する

文字列があります。

one_two_three_four_five

A上記の文字列に変数値とtwo変数B値を格納する必要があります。four

kshを使用しています。

答え1

cutフィールド区切り記号としてwithを使用し、_必須フィールドを取得します。

A="$(cut -d'_' -f2 <<<'one_two_three_four_five')"
B="$(cut -d'_' -f4 <<<'one_two_three_four_five')"

echoここでは、文字列の代わりにパイプを使用することもできます。

A="$(echo 'one_two_three_four_five' | cut -d'_' -f2)"
B="$(echo 'one_two_three_four_five' | cut -d'_' -f4)"

例:

$ s='one_two_three_four_five'

$ A="$(cut -d'_' -f2 <<<"$s")"
$ echo "$A"
two

$ B="$(cut -d'_' -f4 <<<"$s")"
$ echo "$B"
four

改行が含まれている場合、各行の2番目と4番目のフィールドではなく、各行の2番目4番目のフィールドを含む$s複数行の文字列が返されます。$s$s

答え2

答えを見たかったawkので、次のようになります。

A=$(awk -F_ '{print $2}' <<< 'one_two_three_four_five')
B=$(awk -F_ '{print $4}' <<< 'one_two_three_four_five')  

オンラインでお試しください!

答え3

POSIX sh 構成のみを使用する場合は、以下を使用できます。パラメータ代替構造一度に1つの区切り文字を解析します。このコードは、必要な数のフィールドが存在すると仮定します。それ以外の場合は、最後のフィールドが複製されます。

string='one_two_three_four_five'
remainder="$string"
first="${remainder%%_*}"; remainder="${remainder#*_}"
second="${remainder%%_*}"; remainder="${remainder#*_}"
third="${remainder%%_*}"; remainder="${remainder#*_}"
fourth="${remainder%%_*}"; remainder="${remainder#*_}"

または、引用符なしでパラメータ置換を使用できます。ワイルドカード拡張障害者IFS区切り文字として設定(区切り文字が空白ではなく単一文字である場合、または一連のスペースが区切り文字の場合にのみ有効です。)

string='one_two_three_four_five'
set -f; IFS='_'
set -- $string
second=$2; fourth=$4
set +f; unset IFS

これにより、位置パラメータが中断されます。関数内でこれを行うと、関数の位置パラメータのみが影響を受けます。

改行文字を含まない文字列の場合、別のアプローチはread組み込み関数を使用することです。

IFS=_ read -r first second third fourth trail <<'EOF'
one_two_three_four_five
EOF

答え4

zsh文字列(on _)を配列に分割できます。

non_empty_elements=(${(s:_:)string})
all_elements=("${(@s:_:)string}")

その後、配列インデックスを介して各要素にアクセスします。

print -r -- ${all_elements[4]}

覚えておいてくださいzsh(ほとんどの他のシェルと似ていますがksh/とは異なりますbash配列インデックスは1から始まります。

または拡張機能から直接:

print -r -- "${${(@s:_:)string}[4]}"

または、匿名関数を使用して、その要素を$1$2...で使用できるようにします。

(){print -r -- $4} "${(@s:_:)string}"

関連情報