にgrepの結果を区切って返し入れラインは、私はgrepコマンド以下のいる配列
echo v1.33.4 | egrep -o '[0-9]{1,3}'
:
1
33
4
バッシュスクリプトでは、私がしたいのですが、それらの行は配列に数字を区切って。 私はそれを直接変数に代入してforループを実行しようとしました。しかし、ループ内のエコーは最初の数1
にgrepの結果を区切って返し入れラインは、私はgrepコマンド以下のいる配列
echo v1.33.4 | egrep -o '[0-9]{1,3}'
:
1
33
4
バッシュスクリプトでは、私がしたいのですが、それらの行は配列に数字を区切って。 私はそれを直接変数に代入してforループを実行しようとしました。しかし、ループ内のエコーは最初の数1
質問
への回答行を配列に保存する方法は? Bash≥4で
のでようmapfile
を使用:
read
文を使用して、
array=()
while read; do
array+=("$REPLY")
done < <(echo "v1.33.4" | egrep -o '[0-9]{1,3}')
または:
mapfile -t array < <(echo "v1.33.4" | egrep -o '[0-9]{1,3}')
バッシュ< 4と、ループを使用
IFS=$'\n' read -r -d '' -a array < <(echo "v1.33.4" | egrep -o '[0-9]{1,3}')
(しかし、コードは1
です)。あなたは、文字列v1.33.4
を格納されている変数を持っていて、数字1
、33
と4
が含まれています配列をしたい
:
回答は(私が信じるもの)あなたの実際の問題を解決するために:以下を使用してください:
string=v1.33.4
IFS=. read -ra array <<< "${string#v}"
これには、まったく外部のユーティリティは必要ありません。上のループに、そして、
string=v1.33.4
if [[ "$string" =~ ^v([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)$ ]]; then
array=("${BASH_REMATCH[@]:1}")
else
echo >&2 "Error, bad string format"
exit 1
fi
:
別の可能性としては、(それはまた、文字列の形式が検証されますので、私はそれはあなたのための最良の選択肢だと言うだろう)正規表現を使用することです配列のフィールド:
for field in "${array[@]}"; do
echo "$array"
done
#Storing it in an array
array=($(echo v1.33.4 | egrep -o '[0-9]{1,3}'))
#Printing an array
for i in ${array[@]}; do echo "$i"; done
1
33
4
サイドノートが得られます。あなたが1行にP/oを複数行を変換したい場合は、
echo v1.33.4 | egrep -o '[0-9]{1,3}' |paste -sd' '
1 33 4
ニース!しかし、@gniourf_gniourfのような純粋な 'bash'の解決策はより効率的です。 – Inian
thanks..learning ..マン私はちょうど学んでいる:) –
配列を定義していないことに注意してください。 'array =($(echo v1.33.4 | egrep -o '[0-9] {1,3}'))'が必要です。しかし、このソリューションは、単語の分割とパス名の拡張の対象となるため、反パターンです。 –
'array =($(コマンド))' – 123