我有一个包含以下模式文件的目录:
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'