如何将正则表达式(使用 grep?)的不同结果检索到变量中?

如何将正则表达式(使用 grep?)的不同结果检索到变量中?

问题简述

给定一个字符串,如何根据正则表达式检索多个子字符串?

echo "hello world 15 42" | grep -P ".*([0-9]+) ([0-9]+)";

不幸的是,这会返回完整的匹配字符串,而不是分别返回 15 和 42。理想情况下,某个变量可以恢复它们,这样我就可以使用它们:

echo "First: $0, Second: $1"; # echo is only an example

更多上下文

对于安装脚本,需要从URL下载相关文件(使用wget),但具体文件名未知,因此脚本需要首先下载index.html来提取文件名、提取版本号并重新构造完整的 URL。

wget 2>/dev/null -O - http://...../directory/ | grep -P "<a href=....
wget "http://..../directory/file-$1-revision-$2.gz" -O downloaded.gz

答案1

使用 bash 正则表达式匹配并访问内置 BASH_REMATCH 数组

s="hello world 15 42"
re='.*([0-9]+) ([0-9-]+)'
if [[ $s =~ $re ]]; then
    for key in "${!BASH_REMATCH[@]}"; do 
        printf "%s\t%s\n" "$key" "${BASH_REMATCH[$key]}"
    done
fi
0   hello world 15 42
1   5
2   42

答案2

> greparray=($(echo "hello world 15 42" | grep -Eo "[0-9]+ [0-9]+"))
> echo ${greparray[1]}
42

答案3

我会使用一个数组:

myArray=($(echo "hello world 15 42" | egrep -o '([0-9]+)'))

访问第一个子字符串:

echo ${myArray[0]}
15

...第二个:

echo ${myArray[1]}
42

相关内容