Text-Processing

如何將正則表達式(使用 grep?)的不同結果檢索到變數中?

  • September 17, 2017

簡短的問題

給定一個字元串,如何檢索給定正則表達式的幾個子字元串?

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

使用 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
> greparray=($(echo "hello world 15 42" | grep -Eo "[0-9]+ [0-9]+"))
> echo ${greparray[1]}
42

引用自:https://unix.stackexchange.com/questions/392757