如何从变量中使用*\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
这不起作用。
答案 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