2014-04-02 225 views
0

我使用xmlstarlet進入shell腳本來解析xml文件untitled app.xml,只是爲了獲取其內容是一個字符串,並將其存儲在「my_var」中:通過shell腳本解析XML

my_var=`xmlstarlet sel -t -m "//root/services/service[position=$i]" -v description -n /home/wissem/Bureau/app.xml` 

然後,試圖修改與最後一個命令的輸出的其他XML文件名字的strings.xml時,使用此命令行:

find /root/AndroidStudioProjects/FacebookMenu/app/src/main/res/values/strings.xml -type f -exec perl -pi -w -e 's/name=\"text_'$i'\".*\<\/string\>/name=\"text_'$i'\"\>'$my_var'\<\/string\>/g' {} \; 

我得到以下錯誤:

Substitution replacement not terminated at -e line 1. 

我試圖通過單獨更改我解析到我的變量的字符串來理解問題,我注意到問題出現時,我有一個「空間」的字符串!

解釋更多:爲this_is_my_string:它的工作原理

因爲這是我的字符串:我得到的錯誤。

回答

1

是的,如果$my_var包含空格,shell將在$my_var中斷開參數。這應該工作:

-e "s;name=\"text_$i\".*</string>;name=\"text_$i\">$my_var</string>;g" 

雙引號可以防止您的參數被拆分。你想成爲你的論點的雙引號是已經用反斜槓引用,它可以保護它們。並且$變量在出現在雙引號中時展開。我還用s;...;...;g替換s/../../g,以便正向砍掉不需要轉義。而且我很確定沒有理由避開尖括號。

我測試上述與此過程:

  1. 創建包含/tmp/testq.xml

    <string name="text_100">Blah</string> 
    
  2. 問題:

    i=100 
    my_var="room service" 
    
  3. 問題:

    find /tmp/ -name "testq.xml" -exec perl -p -e "s;name=\"text_$i\".*</string>;name=\"text_$i\">$my_var</string>;g" '{}' \; 
    
  4. 結果到stdout:

    <string name="text_100">room service</string> 
    

我沒有在上面的測試,因爲我希望能夠重新運行測試任意多次使用-i,但-i不應該影響-e表達式的有效性。