我有一个变量
string="ABC400p2q4".
如何区分ABC400
和p2q4
。
我需要将它分成两个变量,这样才能得到
echo $var1
ABC400
echo $var2
p2q4
代替ABC,可以有任何字母字符;代替400,可以有任何其他数字;但是p
和q
是固定的,代替2和4,也可以有任何数字。
答案 0 :(得分:5)
无需基于正则表达式模式进行拆分,因为它们是固定长度的子串。在纯bash
中你会这样做:
$ string="ABC400p2q4"
$ var1=${string:0:6}
$ var2=${string:6}
$ echo $var1
ABC400
$ echo $var2
p2q4
答案 1 :(得分:4)
使用bash和特殊BASH_REMATCH
数组(非固定长度):
$ string='ABC400p2q4'
$ [[ $string =~ ^([a-zA-Z]+[0-9]+)(.*) ]]
$ echo ${BASH_REMATCH[1]}
ABC400
$ echo ${BASH_REMATCH[2]}
p2q4
答案 2 :(得分:3)
使用bash& process substitution(非固定长度):
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')
或使用Kent
中的简短sed substitution
版本
's/([0-9])p/\1 p/'
&
命令中的 sed
代表替换的匹配左侧部分 s///
$ echo $var1
ABC400
$ echo $var2
p2q4
答案 3 :(得分:2)
如果你的琴弦保持单一长度,sudo_O提供的答案是完美的。但是,如果不是这种情况,bash会为您提供string regex matching builtins。
$ string="ABC400p2q4"
$ var1=$( expr match "$string" '\(.{6}\)' )
$ var2=$( expr match "$string" '.*\(.{4}\)' )
将正则表达式替换为您实际需要的任何内容。