我有一个脚本,我一直用它来增加文件名。这些文件的名称类似于“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
在我看来,你的问题不在于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]+)
。
查看演示。