4

我有一个变量

string="ABC400p2q4".

我怎样才能分开ABC400p2q4。我需要将它分成两个变量,结果我得到

echo $var1
ABC400
echo $var2
p2q4

可以用任何字母字符代替 ABC;可以用任何其他数字代替 400;但是pandq是固定的并且可以代替 2 和 4 也可以有任何数字。

4

4 回答 4

6

无需基于正则表达式模式进行拆分,因为它们是固定长度的子字符串。纯粹bash你会这样做:

$ string="ABC400p2q4"

$ var1=${string:0:6}

$ var2=${string:6}

$ echo $var1
ABC400

$ echo $var2
p2q4
于 2013-03-14T13:09:07.477 回答
5

使用和特殊BASH_REMATCH数组(非固定长度):

$ string='ABC400p2q4'
$ [[ $string =~ ^([a-zA-Z]+[0-9]+)(.*) ]]
$ echo ${BASH_REMATCH[1]}
ABC400
$ echo ${BASH_REMATCH[2]}
p2q4
于 2013-03-14T13:26:17.097 回答
3

尝试这样做

使用进程替换(非固定长度):

read var1 var2 < <(sed -r 's/^[a-zA-Z]+[0-9]+/& /' <<< 'ABC400p2q4')

或者这个使用here-string

read var1 var2 <<< $(sed -r 's/^[a-zA-Z]+[0-9]+/& /' <<< 'ABC400p2q4')

或肯特的简短sed substitution版本

's/([0-9])p/\1 p/'

笔记

&sed命令中代表替换的匹配左侧部分 s///

输出

$ echo $var1
ABC400
$ echo $var2
p2q4
于 2013-03-14T13:00:30.813 回答
2

如果您的字符串保持单一长度,则 sudo_O 提供的答案是完美的。但是,如果不是这种情况,bash 确实为您提供了与builtins 匹配的字符串正则表达式

$ string="ABC400p2q4"

$ var1=$( expr match "$string" '\(.{6}\)' )

$ var2=$( expr match "$string" '.*\(.{4}\)' )

用您实际需要的任何内容替换正则表达式。

于 2013-03-14T13:28:02.230 回答