增加一个数字,从 19 变为 20 会出现问题,因为它会变成 110

问题描述 投票:0回答:1

我有一个脚本,我一直用它来增加文件名。这些文件的名称类似于“YYYY-MM-DD name V.23”。只要不跳转到下 10 个,它就可以很好地工作,这就是为什么我到目前为止还没有注意到问题。但当它转到下一个 10 时,它似乎看不到整个数字,而只看到最后一位数字。它与 Bash-Rematch 有关,但我无法弄清楚。

#!/bin/bash

fileName=$1

today=$(date +"%Y-%m-%d")


if [[ $fileName =~ ([0-9]+-[0-9]+-[0-9]+)(.*)([0-9]+)\.([^.]*) ]]; then
  # BASH_REMATCH match groups:
  # 1 - date
  # 2 - everything else
  # 3 - number
  # 4 - extension

  number=$(( ${BASH_REMATCH[3]} + 1 ))

  while :; do
        newFileName="$(date +%Y-%m-%d)${BASH_REMATCH[2]}${number}.${BASH_REMATCH[4]}"
        [[ -f $newFileName ]] || break
        let "number++"
  done

  echo "copy $fileName to $newFileName"
  cp "$fileName" "$newFileName"

elif [[ $fileName =~ (.*)\.([^.]*) ]]; then
    newNumber="1"
    addInfoName="$today ${BASH_REMATCH[1]} V.${newNumber}.${BASH_REMATCH[2]}"

    mv "$fileName" "$addInfoName" 
    let "newNumber++"
    cp "$addInfoName" "$today ${BASH_REMATCH[1]} V.${newNumber}.${BASH_REMATCH[2]}"
fi

该脚本应该检查文件开头的日期是否是今天(如果在复制文件时没有更改),然后查看末尾是否有数字(如果没有添加一个)并增加该数字1.

例如如果我在

2023-09-25 Letter Application V.3
上触发脚本,它就会变成
2023-10-28 Letter Application V.4

如何让脚本考虑最后的整数(例如

29
),以便它变成下一个10(例如
30
而不是
210
)?

ChatGPT 和类似建议在正则表达式字段中的数字周围添加 [[:space:]] (例如

([0-9]+-[0-9]+-[0-9]+)(.*)([[:space:]][0-9]+[[:space:]])(\.[^.]*)$
),但这会导致根本无法识别数字(以及开始时的日期),因此它然后看起来像
2023-10-28 2023-09-25 Letter Application V. 29 V. 1

bash file-rename
1个回答
0
投票

在我看来,你的问题不在于2位数字。 RE 与您指定的字符串模式不匹配。

  • 您的琴弦模式:
    YYYY-MM-DD name V. 23
  • 您的回复:
    ([0-9]+-[0-9]+-[0-9]+)(.*)([0-9]+)\.([^.]*)

根据 RE,字符串以

number.extension
结尾,这是不正确的。

我认为您需要的 RE 是

([0-9]+-[0-9]+-[0-9]+)\s+([^0-9]+)\s+V\.\s+([0-9]+)

查看演示

© www.soinside.com 2019 - 2024. All rights reserved.