1

我正在编写一个 bash 脚本,我需要在其中检查现有文件的目录,并在将新文件添加到目录时查看文件名第一段的最后 4 位数字以设置计数器。

命名结构:

yymmddHNAZXLCOM0001.835

我需要将示例 0001 中的部分放入 CTR 变量中,以便它放入目录的下一个文件将是

yymmddHNAZXLCOM0002.835

等等。

什么是最简单和最短的方法?

4

3 回答 3

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"

注意:此版本假定文件名中没有空格。

于 2012-10-09T18:20:43.313 回答
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 *
于 2012-10-09T19:22:16.593 回答
0

尝试这个...

current=`echo yymmddHNAZXLCOM0001.835 | cut -d . -f 1 | rev | cut -c 1-4 | rev`
next=`echo $current | awk '{printf("%04i",$0+1)}'`
于 2012-10-09T18:22:29.987 回答