2014-01-14 18 views
0

我想讀取文件中的行,如果行中包含標記,則標記內的文本用於替換具有不同值的標記屬性文件,在行之前,所有被替換的標籤被寫入到不同的文件中。shell bash用不同文件中的值替換行中的標記

所以正在讀取的初始文件都將遵循以下格式的行:

testkey "TEST-KEY" "[#key_location#]:///[#key_name#]" 

其中,[#和#]房子的標記文字。然後

有產文件將包含如下行:

key_location=location_here 
key_name=test_key_name 

所以最終的結果我想實現的是,該行被寫入到一個新文件,但標籤被從該值替換屬性文件,因此,使用以上內容:

testkey "TEST-KEY" "loaction_here:///test_key_name" 

我不知道如何以最佳方式處理標籤,並在一行處理多個標籤,並很漂亮的丟失。任何幫助將不勝感激。

骨架代碼:

​​

編輯文件內

行可以包含一個或多個標籤,並不總是兩個相似給出的例子。

+0

你屬性文件包含多個鍵/名稱,對嗎?什麼是確切的格式?類似於'abc_location = asdf abc_name = asdf''xyz_location = asdf xyz_name = asdf'?或者,奇數行是否包含前一個關鍵位置的關鍵位置和行號? –

+0

屬性文件每行都有一個值,它不僅僅對應於鍵,還有很多其他的值。標籤內的文本將始終與屬性名稱(即=之前的位)相對應。認爲我需要sed的新行代替標籤,只是不知道如何,因爲我的shell的知識是可憐 –

回答

2

您將不得不做一些循環和全局sed替換。以下是可能不是最優的,但它會幫助您瞭解:

#!/bin/bash 

declare -A props 
while read line ; do 
    key=$(echo $line | sed -r 's/^(.*)=.*/\1/') 
    value=$(echo $line | sed -r 's/^.*=(.*)/\1/') 
    props[$key]=$value 
done < values.properties 

replace() { 
    line=$1 
    for key in "${!props[@]}"; do 
     line=$(echo $line | sed "s/\[#$key#\]/${props[$key]}/g") 
    done 
    echo $line 
} 

while read line ; do 
    while [[ $line == *"[#"*"#]"* ]] ;do 
     line=$(replace "$line") 
     echo Iter: $line 
    done 
    echo DONE: $line 
done < $INITIAL_FILE 

的片斷輸出到標準輸出,它包括中間結果,以便您可以檢查它是如何工作的。我想你會很容易地修改它來寫入文件等。

1

有很多方法可以做到這一點(例如,計數爲#)。但是,簡單地說,你可以只使用*擴張僅僅是開始和結束的字符串之外,從而

if [[ $line == *"[#"*"#]"*"[#"*"#]"* ]]; then 
    echo "has tags" 
else 
    echo "does not have tags" 
fi 

會在你的情況,例如工作

$ echo "$line" 
testkey "TEST-KEY" "[#key_location#]:///[#key_name#]" 
$ if [[ $line == *"[#"*"#]"*"[#"*"#]"* ]]; then echo "has tags"; fi 
has tags 
+0

阿,這是一個很好的觀點,我沒有考慮在標籤間使用*。但是,我會遇到有一個標籤或多個標籤的行的問題。也許我可以grep的標籤線 –