将行分隔的grep结果放入数组中

时间:2016-09-21 08:50:06

标签: arrays bash grep

我有以下grep命令

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

返回:

1
33
4

在Bash-Script中,我想将这些行分隔的数字放入数组中。 我试图将它直接分配给变量并在其上运行for循环。但循环内的回声只产生第一个数字1

2 个答案:

答案 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的变量,并且您想要一个包含数字1334的数组:请使用以下内容:< / 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