问题简述
给定一个字符串,如何根据正则表达式检索多个子字符串?
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