如何在shell中拆分字符串

时间:2013-03-14 12:57:47

标签: regex string bash shell

我有一个变量

string="ABC400p2q4".

如何区分ABC400p2q4。 我需要将它分成两个变量,这样才能得到

echo $var1
ABC400
echo $var2
p2q4

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

4 个答案:

答案 0 :(得分:5)

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

$ string="ABC400p2q4"

$ var1=${string:0:6}

$ var2=${string:6}

$ echo $var1
ABC400

$ echo $var2
p2q4

答案 1 :(得分:4)

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

$ string='ABC400p2q4'
$ [[ $string =~ ^([a-zA-Z]+[0-9]+)(.*) ]]
$ echo ${BASH_REMATCH[1]}
ABC400
$ echo ${BASH_REMATCH[2]}
p2q4

答案 2 :(得分:3)

尝试这样做

使用& 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}\)' )

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