2016-09-21 10 views
1

にgrepの結果を区切って返し入れラインは、私はgrepコマンド以下のいる配列

echo v1.33.4 | egrep -o '[0-9]{1,3}' 

1 
33 
4 

バッシュスクリプトでは、私がしたいのですが、それらの行は配列に数字を区切って。 私はそれを直接変数に代入してforループを実行しようとしました。しかし、ループ内のエコーは最初の数1

+0

'array =($(コマンド))' – 123

答えて

2

質問

への回答

行を配列に保存する方法は? 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を格納されている変数を持っていて、数字1334が含まれています配列をしたい


回答は(私が信じるもの)あなたの実際の問題を解決するために:以下を使用してください:

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 
1
#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 
+1

ニース!しかし、@gniourf_gniourfのような純粋な 'bash'の解決策はより効率的です。 – Inian

+1

thanks..learning ..マン私はちょうど学んでいる:) –

+0

配列を定義していないことに注意してください。 'array =($(echo v1.33.4 | egrep -o '[0-9] {1,3}'))'が必要です。しかし、このソリューションは、単語の分割とパス名の拡張の対象となるため、反パターンです。 –

関連する問題