文字列があります。
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}"