2009-08-05 74 views

回答

1

goto選項對我來說是bash,awk和perl。我不確定你想要做什麼,但是三者中的任何一個都可能運作良好。例如:

f=somestring 
string=$(expr match "$f" '.*\(expression\).*') 
echo $string 
1

您標記了一個問題,慶典,所以我將假設你問如何在bash腳本做到這一點。不幸的是,內置的正則表達式匹配不保存字符串索引。但是,如果你以提取匹配子問這個,你很幸運:

if [[ "$var" =~ "$regex" ]]; then 
    n=${#BASH_REMATCH[*]} 
    while [[ $i -lt $n ]] 
    do 
     echo "capture[$i]: ${BASH_REMATCH[$i]}" 
     let i++ 
    done 
fi 

這段代碼將依次輸出的所有子匹配。第一個(索引0)將是整個比賽。

雖然您可能會更喜歡您的awk選項。有一個功能match它給你你想要的索引。文檔可以找到here。如果你需要的話,它還會在RLENGTH中存儲比賽的長度。要在bash腳本實現這一點,你可以這樣做:

match_index=$(echo "$var_to_search" | \ 
awk '{ 
    where = match($0, '"$regex_to_find"') 
    if (where) 
     print where 
    else 
     print -1 
}') 

有很多的方式來處理與傳遞變量到awk中。這種管道輸出的組合直接將其嵌入awk單線內是相當常見的。您也可以使用-v選項給awk變量值(請參閱man awk)。

顯然你可以修改它來獲得長度,匹配字符串,無論你需要什麼。您可以捕獲多東西放進如果有必要的數組變量:

match_data=($(... awk '{ ... print where,RLENGTH,match_string ... }')) 
2

假設你想要的是使用bash找到字符串通配符的第一場比賽的位置,下面的bash函數返回了這一點,或空,如果通配符不匹配:

 
function match_index() 
{ 
    local pattern=$1 
    local string=$2 
    local result=${string/${pattern}*/} 

    [ ${#result} = ${#string} ] || echo ${#result} 
} 

例如:

 
$ echo $(match_index "a[0-9][0-9]" "This is a a123 test") 
10 

如果你想允許全面的正則表達式,而不是僅僅通配符,更換「本地結果=」與

 
local result=$(echo "$string" | sed 's/'"$pattern"'.*$//') 

線,但隨後你接觸到平時的shell引用問題。

0

如果您使用bash 4.x,您可以源代碼oobash。寫在bash與OO風格的字符串lib目錄下:

http://sourceforge.net/projects/oobash/

字符串是構造函數:

字符串一個ABCDA

a.indexOf一個

a。lastIndexOf一個

a.indexOf達

有許多 「辦法」 更在腳本中處理字符串的工作:

-base64Decode  -base64Encode -capitalize  -center    
-charAt   -concat  -contains   -count    
-endsWith   -equals  -equalsIgnoreCase -reverse   
-hashCode   -indexOf  -isAlnum   -isAlpha   
-isAscii   -isDigit  -isEmpty   -isHexDigit   
-isLowerCase  -isSpace  -isPrintable  -isUpperCase  
-isVisible   -lastIndexOf -length   -matches   
-replaceAll  -replaceFirst -startsWith  -substring   
-swapCase   -toLowerCase -toString   -toUpperCase  
-trim    -zfill