2016-09-21 4 views
1

У меня есть следующие команды GrepPut линии отделено результат Grep в массив

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

, которая возвращает:

1 
33 
4 

В Bash-Script Я хотел бы, но те линии отделено числа в массиве , Я попытался присвоить его переменной переменной и запустить цикл for. Но эхо в цикле только дает первое число 1

+0

'array = ($ (command))' – 123

ответ

2

Ответ на вопрос

Как хранить строки в массиве?

С Bash≥4, использовать mapfile следующим образом:

mapfile -t array < <(echo "v1.33.4" | egrep -o '[0-9]{1,3}') 

С Bash < 4, использовать цикл:

array=() 
while read; do 
    array+=("$REPLY") 
done < <(echo "v1.33.4" | egrep -o '[0-9]{1,3}') 

или, используя один read заявление:

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 
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 

Side Примечание: Если вы хотите конвертировать многострочный о/р в одну линию, то

echo v1.33.4 | egrep -o '[0-9]{1,3}' |paste -sd' ' 
1 33 4 
+1

Ницца! Но чистое решение 'bash', вроде @gniourf_gniourf, было бы более эффективным. Спасибо! – Inian

+1

thanks..learning ..man Я просто изучаю :) –

+0

Обратите внимание, что вы не определяете массив. Вам понадобится: 'array = ($ (echo v1.33.4 | egrep -o '[0-9] {1,3}'))'. Но тогда это решение является антипаттерном, поскольку оно подвержено разбиению слов и расширению пути. –

Смежные вопросы