Shell 通过正则表达式提取子串

通过 grep

grep 的 -o 选项,可以只打印匹配的部分,否则会打印整行。

$ echo "libgcc-4.8.5-4.h5.x86_64.rpm" | grep -Eo "[0-9]+\.[0-9]+.*x86_64"
4.8.5-4.h5.x86_64
$ echo "libgcc-4.8.5-4.h5.x86_64.rpm" | grep -E "[0-9]+\.[0-9]+.*x86_64"
libgcc-4.8.5-4.h5.x86_64.rpm

复制的字符串匹配,可以通过 grep 进行多次匹配:

resnum=`echo $result | grep -Eo "Corp.*?[0-9]+.*?!"|grep -Eo "[0-9]+"`
if [[ $resnum -lt 300 ]];then
  echo "start sms alarm:$resnum"
fi

通过 sed

sed 使用 \1 反向引用前面匹配的组。

但是 sed 没有只显示匹配部分的功能,会显示整行,所以采用的思路是将整行替换为子串,比较麻烦。

$ echo "libgcc-4.8.5-4.h5.x86_64.rpm" | sed -r "s/libgcc-([0-9]+\.[0-9]+.*)\.rpm/\1/g"
4.8.5-4.h5.x86_64