我有一个要处理的通用模式字符串。我希望能够将字符串5B299
转换为5B300
(将最后一个数字加1)。
我想避免盲目地按索引拼接字符串,因为第一个数字和字母的大小可以更改。本质上,我希望能够获得第一个字符之后的所有内容的全部值,将其递增一个,然后重新附加。
到目前为止,我在网上唯一发现的内容是向我展示如何使用分隔符进行剪切,但是我没有恒定的分隔符。
答案 0 :(得分:2)
您可以将bash
shell支持的正则表达式功能与其~
结构一起使用,该结构支持基本扩展正则表达式匹配(ERE)。您所需要做的就是定义一个正则表达式,然后对捕获的组进行处理以获取结果字符串
str=5B299
re='^(.*[A-Z])([0-9]+)$'
现在使用~
运算符进行正则表达式匹配。如果正则表达式匹配成功,则~
运算符将使用捕获的组填充数组BASH_REMATCH
。第一部分(示例中的5B
)将存储在索引0
中,下一部分将存储在1
中。我们使用1
运算符递增索引$((..))
上的值。
if [[ $str =~ $re ]]; then
result="${BASH_REMATCH[1]}$(( BASH_REMATCH[2] + 1 ))"
printf '%s\n' "$result"
fi
正则表达式的POSIX版本不受语言环境的依赖,将使用字符类而不是范围表达式作为
posix_re='^(.*[[:alpha:]])([[:digit:]]+)$'
答案 1 :(得分:2)
您可以使用bash的 parameter-expansion 字符串索引以及POSIX算术运算符轻松地完成您尝试的操作。例如,您可以这样做:
#!/bin/bash
[ -z "$1" ] && { ## validate at least 1 argument provided
printf "error: please provide a number.\n" >&2
exit 1
}
[[ $1 =~ [^0-9][^0-9]* ]] && { ## validate all digits in argument
printf "error: input contains non-digit characters.\n" >&2
exit 1
}
suffix=${1:1} ## take all character past 1st as suffix
suffix=$((suffix + 1)) ## increment suffix by 1
result=${1:0:1}$suffix ## append suffent to orginal 1st character
echo "$result" ## output
exit 0
哪个将保留第一个字符,而将其余字符增加1
,然后再次与原始的第一个数字合并,同时验证输入仅包含数字,例如
使用/输出示例
$ bash prefixsuffix.sh
error: please provide a number.
$ bash prefixsuffix.sh 38a900
error: input contains non-digit characters.
$ bash prefixsuffix.sh 38900
38901
$ bash prefixsuffix.sh 39999
310000
仔细研究一下,让我知道这是否是您想要的。
答案 2 :(得分:1)
您可以将sed
与awk
结合使用:
increment() {
echo $1 | sed -r 's/([0-9]+[a-zA-Z]+)([0-9]+)/\1 \2/' | awk '{printf "%s%d", $1, ++$2}'
}
echo $(increment "5B299")
echo $(increment "127ABC385")
echo $(increment "7cf999")
输出:
5B300
127ABC386
7cf1000