unix 如何在shell脚本中从字符串中获取数字

i1icjdpr  于 2023-10-18  发布在  Unix
关注(0)|答案(3)|浏览(232)

我在shell脚本的$FILE变量中存储了一个文件名,例如:
$FILE = application-231241223.tar
可以有不同的.tar文件名存储在那里。它们都有一个共同点,那就是在.tar之前有一个数字。
我需要将这个数字存储在$PROCESS_NUMBER变量中,而不考虑它的长度
文件名也可以是application-2412-test-12312333.tar或application-2412-test12312333.tar
我唯一需要存储的是.tar之前的数字,直到出现数字以外的字符。数字的长度也可以不同。
有人能给我建议怎么做吗
我试过了,没有用

export PROCESS_NUMBER=$(echo "$FILE" | sed 's/.*\([0-9]\+\)\.tar/\1')
export PROCESS_NUMBER=$(echo "$FILE" | sed 's/.*([0-9]+)\.tar/\1/g')
export PROCESS_NUMBER=$(echo "$FILE" | sed 's/[^0-9]*\([0-9]\+\).*/\1/')
export PROCESS_NUMBER=$(echo "$FILE" | sed 's/.*-\([0-9]\{1,\}\)\.tar/\1/')
muk1a3rh

muk1a3rh1#

一个使用正则表达式和BASH_REMATCH[]数组的bash想法:

regex='([0-9]+)\.tar'

for fname in application-231241223.tar application-2412-test-12312333.tar application-2412-test12312333.tar
do
    echo "###### $fname"
    [[ "$fname" =~ $regex ]] && typeset -p BASH_REMATCH
done

这产生:

###### application-231241223.tar
declare -ar BASH_REMATCH=([0]="231241223.tar" [1]="231241223")
                                              ^^^^^^^^^^^^^^^
###### application-2412-test-12312333.tar
declare -ar BASH_REMATCH=([0]="12312333.tar" [1]="12312333")
                                             ^^^^^^^^^^^^^^    
###### application-2412-test12312333.tar
declare -ar BASH_REMATCH=([0]="12312333.tar" [1]="12312333")
                                             ^^^^^^^^^^^^^^

我们要查找的值位于BASH_REMATCH[1]位置,因此OP的代码变为:

regex='([0-9]+)\.tar'

for fname in application-231241223.tar application-2412-test-12312333.tar application-2412-test12312333.tar
do
    [[ "$fname" =~ $regex ]] && export PROCESS_NUMBER="${BASH_REMATCH[1]}"
done

使用参数扩展的替代方案:

for fname in application-231241223.tar application-2412-test-12312333.tar application-2412-test12312333.tar
do
    echo "###### $fname"
    newfname="${fname%.tar}"
    newfname="${newfname##*[^0-9]}"
    typeset -p newfname
done

这产生:

###### application-231241223.tar
declare -- newfname="231241223"
                     ^^^^^^^^^
###### application-2412-test-12312333.tar
declare -- newfname="12312333"
                     ^^^^^^^^
###### application-2412-test12312333.tar
declare -- newfname="12312333"
                     ^^^^^^^^

OP的代码变为:

for fname in application-231241223.tar application-2412-test-12312333.tar application-2412-test12312333.tar
do
    newfname="${fname%.tar}"
    export PROCESS_NUMBER="${newfname##*[^0-9]}"
done
hl0ma9xz

hl0ma9xz2#

您可以使用bash的parameter substitution将所有非数字替换为空格,然后通过迭代其单词来检索最后一个数字块。范例:

FILE="application-2412-test-12312333.tar"
PROCESS_NUMBER="${FILE//[^0-9]/ }"
for PROCESS_NUMBER in $PROCESS_NUMBER; do :; done
echo "$PROCESS_NUMBER"
12312333
41zrol4v

41zrol4v3#

使用awk,因为它总是在.tar中完成(因此是-4)

awk -F '[^0-9]' '{print $(NF-4)}'

相关问题