2012-05-09 47 views
1

我需要從包含多個子字符串的字符串中提取數據。使用多個子字符串展開字符串

例子:

@string1 = "string 1" 
@string2 = "string 2" 
@string3 = "string 3" @string1 @string2 

我需要擴大STRING3。其結果將是:

「STRING3字符串2字符串1」

如何使用bash我展開列表?


其實我需要讀一個現有的gitolite配置文件的一部分,所以格式是正確的。該字符串始終以'@'開頭。一個字符串可以包含一個子字符串。

這是格式的樣子:

@string1 = hello 
@string2 = everyone 
@resultstring = @string1 @string2 this is a string 

現在我想擴大@resultstring。其結果將是:「大家好,這是一個字符串」

+0

你能解釋的邏輯:'「串3」 @字符串1 @ string2' - >'「STRING3字符串2字符串1」' – kev

+0

這句法似乎並不像'巴sh'給我。 –

+0

你確定你沒有考慮'string1 =「string 1」; .... string3 =「string3」$ string1「」$ string2「。祝你好運。 – shellter

回答

2

你想要的是

string1='string 1' 
string2='string 2' 
string3="string 3 $string1 $string2" 

單引號是強引用,沒有擴展的變量,而在另一方面,你可以擴展中的變量雙引號。

另見http://mywiki.wooledge.org/Quotes

+1

@ErikB,注意這個答案中的語法:沒有前導'@',在'='周圍沒有空格,使用'''來取消引用一個變量。 –

+0

其實我需要讀取現有配置文件的一部分。 – ErikB

0

如果 「=」 在其他地方硬編碼的,你可以使用這個AWK助手與任何POSIX外殼:

#!/bin/sh 
print_var(){ 
    awk 'BEGIN{FS=" = "} 
    { if ($1=="'$1'"){ 
      len=split($2,words," ") 
      for(i=0;i<=len;i++){ 
       if (match(words[i],"@")) printf strings[words[i]] 
       else printf words[i] 
       printf (i==len)?"\n":" " 
      } 
     } else strings[$1]=$2 
    }' $2 
} 

print_var @resultstring input 

,或者慶典,4.0isms都OK,你可以閱讀該字符串的關聯數組直接

#!/bin/bash 
print_var(){ 
    declare -A STRINGS 
    while read FIRST EQUAL STRING || [ "$FIRST" ]; do 
     case $FIRST in 
     @*)STRINGS["${FIRST#@}"]="$STRING";; 
     esac 
    done < "$2" 
    for x in ${STRINGS[${1#@}]}; do 
     case $x in 
     @*)printf "%s " ${STRINGS[${x#@}]};; 
     *)printf "%s " "$x";; 
     esac 
    done 
    echo 
} 

print_var @resultstring input 
+0

注意:對於bash版本,我設置了它,因此您可以忽略@前綴 – technosaurus

相關問題