我有一个变量
string="ABC400p2q4".
我怎样才能分开ABC400
和p2q4
。我需要将它分成两个变量,结果我得到
echo $var1
ABC400
echo $var2
p2q4
可以用任何字母字符代替 ABC;可以用任何其他数字代替 400;但是p
andq
是固定的并且可以代替 2 和 4 也可以有任何数字。
无需基于正则表达式模式进行拆分,因为它们是固定长度的子字符串。纯粹bash
你会这样做:
$ string="ABC400p2q4"
$ var1=${string:0:6}
$ var2=${string:6}
$ echo $var1
ABC400
$ echo $var2
p2q4
使用bash和特殊BASH_REMATCH
数组(非固定长度):
$ string='ABC400p2q4'
$ [[ $string =~ ^([a-zA-Z]+[0-9]+)(.*) ]]
$ echo ${BASH_REMATCH[1]}
ABC400
$ echo ${BASH_REMATCH[2]}
p2q4
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
如果您的字符串保持单一长度,则 sudo_O 提供的答案是完美的。但是,如果不是这种情况,bash 确实为您提供了与builtins 匹配的字符串正则表达式。
$ string="ABC400p2q4"
$ var1=$( expr match "$string" '\(.{6}\)' )
$ var2=$( expr match "$string" '.*\(.{4}\)' )
用您实际需要的任何内容替换正则表达式。