2014-09-21 104 views
0

我有一个潜在的输入来自bash脚本中的read -e -p命令。例如,用户将键入L50CA。用户可以键入的一些其他可能性是:K117CB,K46CE2V9CE1Bash的正则表达式匹配

我要分手什么在读我读这样的:。

read -e -p "What first atom? " sel1 

话,我想作一个这样的数组(但这不会分开):

arr1=($sel1) 

但我需要使得

${arr1[0]}是等于L ${arr1[1]}等于50 到阵列分离${arr1[2]}等于CA

此分隔必须与上面列出的其他可能的用户输入格式一起使用。正则表达式似乎是这样做的方式。我可以使用以下正则表达式隔离输入的前两个匹配:^\D\d*(?=\w)

我需要匹配第三个组件并将其实施到数组中的帮助。或者,将用户输入分解为三个新变量也很好。或者我们可以在每个匹配之间放置一个空格,因此L50CA转换为L 50 CA,因为那么arr1=($sel1)将起作用。

感谢您的帮助。

+0

'K46CE2'分成了什么? 'K','46','CE2'?或'K','46','CE','2'? – 2014-09-21 22:41:41

+0

它会分成K 46 CE2。如果他们像jm66的回答一样分开出来,那很好,因为把第三和第四个条目结合起来就是微不足道的。 – PhysicalChemist 2014-09-21 22:43:42

回答

1

for sel in L50CA K117CB K46CE2 V9CE1 
do 
     arr=($(sed 's/\([0-9][0-9]*\)/ \1 /g'<<<"$sel")) 
     echo "${arr[@]}" 
done 

打印

L 50 CA 
K 117 CB 
K 46 CE 2 
V 9 CE 1 
+0

非常感谢。我所需要做的就是结合'$ {arr [2]} $ {arr [3]}'。好的解决方案 – PhysicalChemist 2014-09-21 22:39:21

2

击唯一的解决办法:

for sel in L50CA K117CB K46CE2 V9CE1; do 
    [[ "$sel" =~ "^(\w)([0-9]+)(.*)" ]] 
    printf '%s - ' "${BASH_REMATCH[@]}" 
    printf \\n; 
done 
1

在bash使用string manipulation

~$ sel1=L50CA 
~$ part1=$(expr match $sel1 "\([A-Z]\+\).*") 
~$ part2=$(expr match $sel1 "[A-Z]*\([0-9]\+\).*") 
~$ part3=$(expr match $sel1 "[A-Z]*[0-9]*\([A-Z]*\)") 
~$ echo $part{1,2,3} 
L 50 CA 
~$ arr=($part{1,2,3}) 
~$ echo ${arr[@]} 
L 50 CA 
+0

我甚至不知道在bash中存在字符串操作......多么优雅。感谢您的出色解决方案。 – PhysicalChemist 2014-09-21 22:54:06

+0

那不是'expr'的'bash'。 – 2014-09-22 00:21:49

+0

@EtanReisner http://en.wikipedia.org/wiki/Expr显示它作为内置命令合并到shell中。 (这里'type expr'给出'expr是/ usr/bin/expr'虽然。) – steffen 2014-09-22 08:32:15