用bash从字符串中提取整数

时间:2018-07-16 07:37:03

标签: regex linux bash

如何从变量中使用*\d+.\d+.\d+*提取格式为bash(4.12.3123)的整数。

filename="xzxzxzxz4.12.3123fsfsfsfsfsfs" 

我尝试过:

filename="xzxzxzxz4.12.3123fsfsfsfsfsfs" 
if [[ "$filename" =~ (.*)(\d+.\d+.\d+)(.*) ]]; then 
    echo ${BASH_REMATCH} 
    echo ${BASH_REMATCH[1]} 
    echo ${BASH_REMATCH[2]} 
    echo ${BASH_REMATCH[3]} 
else 
    echo 'nej' 
fi 

这不起作用。

3 个答案:

答案 0 :(得分:2)

就Bash版本和转义之间的一致性而言,在Bash中使用正则表达式的最简单方法是将正则表达式放入单引号中,然后将其不加引号,如下所示:

re='[0-9]+\.[0-9]+\.[0-9]+'
[[ $filename =~ $re ]] && printf '%s\n' "${BASH_REMATCH[@]}"

您的方法的主要问题是您使用的是“ Perl风格” \d,因此实际上您可以使代码适用于:

if [[ "$filename" =~ (.*)([0-9]+\.[0-9]+\.[0-9]+)(.*) ]]; then
  echo "${BASH_REMATCH[2]}"
fi

但是,即使您不需要一个捕获组,也不必要创建三个捕获组。请注意,我还将.(任何字符)更改为\.(文字.)。

答案 1 :(得分:1)

一种提取方式:

 grep -oP '\d\.\d+\.\d+' <<<$xfilename

答案 2 :(得分:0)

还有另一种方法

$ filename="xzxzxzxz4.12.3123fsfsfsfsfsfs"
$ awk '{ if (match($0, /[0-9].[0-9]+.[0-9]+/, m)) print m[0] }' <<< "$filename"
4.12.3123