2016-01-28 108 views
2

我已經看過幾個線程,只是似乎無法得到它的工作。很明顯,我的正則表達式和/或bash_rematch是一個問題。正則表達式來提取括號內的值

將有永遠只能是4×一MAX()的

有以下bash腳本:

#!/bin/bash 
brackets_regex="\((.*?)\)" 
text="random date (entry1) some more random data (entry2) random (entry3) random data (entry4)" 

if [[ $text =~ $brackets_regex ]]; then 
    echo ${BASH_REMATCH[0]}; 
    echo ${BASH_REMATCH[1]}; 
    echo ${BASH_REMATCH[2]}; 
    echo ${BASH_REMATCH[3]}; 
fi 

預期的輸出應該是:

entry1 
entry2 
entry3 
entry4 

電流輸出:

(entry1) some more random data (entry2) random (entry3) random data (entry4) 
entry1) some more random data (entry2) random (entry3) random data (entry4 

回答

2

使用GNU的grep:

grep -oP '\(\K[^)]*' <<< "$text" 
entry1 
entry2 
entry3 
entry4 

使用的GNU AWK:

text="random date (entry1) some more random data (entry2) random (entry3) random data (entry4)" 
awk -v FPAT='\\([^)]*\\)' '{for(i=1; i<=NF; i++) {gsub(/[()]/, "", $i); print $i}}' <<< "$text" 
entry1 
entry2 
entry3 
entry4 
+1

非常感謝 - 這工程100% – Greg

+0

有多麼容易將將這些值分配給變量。所以Var1 = entry1,Var2 = entry2等 – Greg

+0

它可以賦值給一個數組:arr =($(grep -oP'\(\ K [^)] *'<<<「$ text」))' – anubhava

0

猛砸正則表達式不支持懶惰量詞。您需要依賴與任何字符匹配的否定字符類別[^()],但要使用()

這裏是實現的另一種方式,你需要的東西:

#!/bin/bash 
text="random date (entry1) some more random data (entry2) random (entry3) random data (entry4)" 
brackets_regex="\(([^()]*)\)" 
for s in ${text[@]}; do 
    if [[ ${s} =~ $brackets_regex ]]; then 
     echo ${BASH_REMATCH[1]}; 
    fi 
done 

IDEONE demo

輸出:

entry1 
entry2 
entry3 
entry4