如何在shell中拆分字符串

4

我有一个变量:

string="ABC400p2q4".

我需要如何将ABC400p2q4分开。我需要以这样一种方式将它们分离成两个变量,以便最终得到以下结果:

echo $var1
ABC400
echo $var2
p2q4

ABC可以替换为任何字母;400可以替换为其他任何数字;但是pq是固定的,而2和4也可以被替换为任何数字。


1
什么Shell?至少有几十种。 - Joey
其他值怎么办? 分割的标准是什么? 是前6个字符和后4个字符吗(但如果长度不是10会发生什么)? 是ABC加3位数字与尾随材料对比吗? 还是3个大写字母,3个数字和尾随材料? 在第一个'p'之前分裂吗? 对于您指定的任务:var1 = ABC400; var2 = p2q4 ,完成了任务,没有任何麻烦。 - Jonathan Leffler
1
信息太少了。你的字符串有什么模式或规则吗? - Kent
在ABC的位置可以是任何字母,在400的位置可以是任何其他数字,但p和q是固定的,2和3的位置也可以是任何数字。 - XYZ_Linux
4个回答

7

不需要基于正则表达式模式进行分割,因为它们是固定长度的子字符串。在纯 bash 中,您可以这样做:

$ string="ABC400p2q4"

$ var1=${string:0:6}

$ var2=${string:6}

$ echo $var1
ABC400

$ echo $var2
p2q4

5

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

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

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')

或者使用来自Kent的短sed替换版本。

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

注意

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

输出

$ echo $var1
ABC400
$ echo $var2
p2q4

+1 对于这个空格的想法。从他的描述来看,我认为这也可以工作?sed -r 's/([0-9])p/\1 p/' - Kent
就像在 Perl 中一样,有更多的方法来做它 =) 还添加了你的解决方案。 - Gilles Quénot

2
sudo_O提供的答案对于单个长度的字符串是完美的。但是,如果不是这种情况,bash会为您提供字符串正则表达式匹配内置函数。请参考字符串正则表达式匹配内置函数
$ string="ABC400p2q4"

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接