我正在编写一个bash脚本,我需要检查现有文件的目录,并查看文件名第一段的最后4位数,以便在将新文件添加到目录时设置计数器。
命名结构:
yymmddHNAZXLCOM0001.835
我需要将示例0001中的部分放入CTR变量中,这样它放入目录的下一个文件将是
yymmddHNAZXLCOM0002.835
等等。
最简单,最短的方法是什么?
答案 0 :(得分:1)
您可以使用sed
:
filename="yymmddHNAZXLCOM0001.835"
first_part=$(echo $filename | sed -e 's/\(.*\)\([0-9]\{4,4\}\)\.\(.*\)/\1/')
counter=$(echo $filename | sed -e 's/\(.*\)\([0-9]\{4,4\}\)\.\(.*\)/\2/')
suffix=$(echo $filename | sed -e 's/\(.*\)\([0-9]\{4,4\}\)\.\(.*\)/\3/')
echo "$first_part$(printf "%04u" $(($counter + 1))).$suffix"
=> "yymmddHNAZXLCOM0002.835"
所有三个sed
调用都使用相同的正则表达式。唯一改变的是选择返回的组。可能有一种方法可以在一次通话中完成所有这些操作,但我的sed
- fu生锈了。
备用版本,使用Bash数组:
filename="yymmddHNAZXLCOM0001.835"
ary=($(echo $filename | sed -e 's/\(.*\)\([0-9]\{4,4\}\)\.\(.*\)/\1 \2 \3/'))
echo "${ary[0]}$(printf "%04u" $((${ary[1]} + 1))).${ary[2]}"
=> "yymmddHNAZXLCOM0002.835"
注意:此版本假定文件名中没有空格。
答案 1 :(得分:0)
试试这个......
current=`echo yymmddHNAZXLCOM0001.835 | cut -d . -f 1 | rev | cut -c 1-4 | rev`
next=`echo $current | awk '{printf("%04i",$0+1)}'`
答案 2 :(得分:0)
f() {
if [[ $1 =~ (.*)([[:digit:]]{4})(\.[^.]*)$ ]]; then
local -a ctr=("${BASH_REMATCH[@]:1}")
touch "${ctr}$((++ctr[1]))${ctr[2]}"
# ...
else
echo 'no matches'
fi
}
shopt -s nullglob
f *