如何使用正则表达式从 bash 中的文件名中仅选择数字

如何使用正则表达式从 bash 中的文件名中仅选择数字

我有一个包含以下模式文件的目录:

SNAFU12.jpg
SNAFU1.jpg
SNAFU123.jpg

我尝试使用此代码,但没有产生任何输出:

 for f in *.jpg; do
   regex="/\d/g"
   file="f:5:6"
   if [[ $file =~ $regex ]]; then
        echo ${BASH_REMATCH[1]}
   fi
 done

我的预期输出应该是:

12
1
23

答案1

您的正则表达式模式不匹配任何内容,因为它试图匹配两个/s,它们是 *nix 的目录分隔符,并且没有文件名包含它。我假设/.../g来自您的 JavaScript(或其他)正则表达式实践,不是吗?

做:

for i in *.jpg; do [[ $i =~ ([0-9]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done

bash正则表达式不支持\d字符类的关键字[0-9]。所以最好使用[0-9],如果你想依赖你的locale,使用字符类[:digit:]

for i in *.jpg; do [[ $i =~ ([[:digit:]]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done

例子:

$ for i in *.jpg; do [[ $i =~ ([0-9]+)\.jpg$ ]] && echo "${BASH_REMATCH[1]}"; done
123
12
1

答案2

修改ls包含文件的文件夹的输出:

ls SNAFU* | sed -e 's/SNAFU\|.jpg//g'

相关内容