我有以下grep命令
echo v1.33.4 | egrep -o '[0-9]{1,3}'
返回:
1
33
4
在Bash-Script中,我想将这些行分隔的数字放入数组中。
我试图将它直接分配给变量并在其上运行for循环。但循环内的回声只产生第一个数字1
答案 0 :(得分:2)
回答问题
如何将线存储到数组中?
如果Bash≥4,请使用mapfile
,如下所示:
mapfile -t array < <(echo "v1.33.4" | egrep -o '[0-9]{1,3}')
使用Bash&lt; 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
的数组:请使用以下内容:< / p>
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 :(得分: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
旁注:如果您希望将多行o / p转换为一行,则
echo v1.33.4 | egrep -o '[0-9]{1,3}' |paste -sd' '
1 33 4