如何将字符串按其内容分开

时间:2019-05-20 05:13:54

标签: bash shell

我有一个要处理的通用模式字符串。我希望能够将字符串5B299转换为5B300(将最后一个数字加1)。

我想避免盲目地按索引拼接字符串,因为第一个数字和字母的大小可以更改。本质上,我希望能够获得第一个字符之后的所有内容的全部值,将其递增一个,然后重新附加。

到目前为止,我在网上唯一发现的内容是向我展示如何使用分隔符进行剪切,但是我没有恒定的分隔符。

3 个答案:

答案 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)

您可以将sedawk结合使用:

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