2014-09-21 107 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