Regex 使用bash从字符串中提取整数

Regex 使用bash从字符串中提取整数,regex,linux,bash,Regex,Linux,Bash,如何使用bash从变量中提取格式为*\d+。\d+。\d+*(4.12.3123)的整数 filename="xzxzxzxz4.12.3123fsfsfsfsfsfs" 我试过: filename="xzxzxzxz4.12.3123fsfsfsfsfsfs" if [[ "$filename" =~ (.*)(\d+.\d+.\d+)(.*) ]]; then echo ${BASH_REMATCH} echo ${BASH_REMATCH[1]} ech

如何使用
bash
从变量中提取格式为
*\d+。\d+。\d+*
(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 
不起作用。

提取的一种方法:

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

grep-oP'\d\.\d+\.\d+'在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
但这不必要地创建了3个捕获组,而您甚至不需要一个。请注意,我还将
(任何字符)更改为
\.
(文字
)。

还有一种方法

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

$awk'{if(匹配($0,/[0-9].[0-9]+.[0-9]+/,m))打印m[0]}您已经尝试了什么?向我们展示您所做的努力,您定义了一个正则表达式,您尝试在bash脚本中使用它了吗?使用
=
bash\u重新匹配
@ap3x:
bash
regex不支持
\d
,将您的正则表达式定义为
regex='^.*([:digit:]{1})\([:digit:]{2})\.([:digit:][digit:]{2}.[:digit:]{4}.*.*.
,但是regexp不起作用。@ap3x:
filename=“xzzxz4.12.3123fsfs”;[[$filename=~$regex]]和&echo${BASH_REMATCH[1]}