2012-11-22 185 views
0

嗨,我堅持使用shell腳本設置XML(值可能包含特殊字符)的標記值。通過shell腳本設置XML標籤

XML標記值應該用雙引號引起來。

要求: 我有一個帶有標記值的xml。對於shell腳本,我必須在標記之前放置一個新值爲 的XML標記。 所以我用sed的,我試圖像below.This工作正常,如果在$ 4 $ 5可是沒有特殊字符。如何使有特殊字符這項工作?(例如:&> <:」;」等)

sed '/<jobResulsDir/s/<jobResulsDir/<CommCellUser userName="'$4'" password="'$5'" > <\/CommCellUser> '$test' <jobResulsDir /' $temp_dir/PreImageModeFile.xml > $temp_dir/PreImageModeFile2.xml 

除了戰略經濟對話有任何其他方式。請幫我

+0

對不起,我想全sed命令didnt貼:sed的「/ < jobResultsDir/s/<\/CommCellUser>'$ test' $ temp_dir/PreImageModeFile2.xml – user12345

+0

你必須告訴它它是代碼。 – choroba

回答

0

Awk不關心「特殊字符」。這在sed:

sed '/<jobResulsDir/s/<jobResulsDir/<CommCellUser userName="'$4'" password="'$5'" > <\/CommCellUser> '$test' <jobResulsDir /' 

這是在AWK:

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    /<jobResulsDir/{ sub(/<jobResulsDir/, "<CommCellUser userName=" userName " password=" password " </CommCellUser> " test " <jobResulsDir ") } 
    { print } 
' 

,但你實際上並不需要,因爲子(以測試/<jobResulsDir/前面)纔會發生,如果RE存在,所以你可以將其縮寫爲:

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    { sub(/<jobResulsDir/, "<CommCellUser userName=" userName " password=" password " </CommCellUser> " test " <jobResulsDir "); print } 
' 

不知道這是您的評論/問題是問什麼,但如果你需要周圍的值名稱雙引號,僅僅調整了劇本,你需要他們,爲他們提供:

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    { sub(/<jobResulsDir/, "<CommCellUser userName=\"" userName "\" password=\"" password "\" </CommCellUser> \"" test "\" <jobResulsDir "); print } 
' 

最後,這裏是你可以拆分工作要更具可讀性,如果你喜歡更有效的一種方法:

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    BEGIN{ 
     q = "\"" 
     rep = \ 
     "<CommCellUser userName=" q userName q\ 
     " password="    q password q\ 
     " </CommCellUser> "  q test  q\ 
     " <jobResulsDir " 
    } 
    { sub(/<jobResulsDir/, rep); print } 
' 

而且看着他提出了這樣,我知道我騙一個很少關於awk不關心「特殊字符」。sub()實際上確實在意替換字符串中的「1」特殊字符「&」,因爲它用於反向引用sub()中匹配的內容,因此您需要用「\ &」替換「\ &」在代表:

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    BEGIN{ 
     q = "\"" 
     rep = \ 
     "<CommCellUser userName=" q userName q\ 
     " password="    q password q\ 
     " </CommCellUser> "  q test  q\ 
     " <jobResulsDir " 
    } 
    { gsub(/&/,"\\\\&",rep); sub(/<jobResulsDir/, rep); print } 

它需要4「\」是因爲字符串文字得到AWK解釋兩次(一次當腳本解釋,並再次當它執行)這樣反而\得到你需要一個反斜槓\ \。

有使用匹配()和SUBSTR(),如果你喜歡的是不具有約束的替代方法:

awk -v userName="$4" -v password="$5" -v test="$test" ' 
    BEGIN{ 
     q = "\"" 
     rep = \ 
     "<CommCellUser userName=" q userName q\ 
     " password="    q password q\ 
     " </CommCellUser> "  q test  q\ 
     " <jobResulsDir " 
    } 
    match($0,/<jobResulsDir/) { 
     $0 = substr($0,1,RSTART) rep substr($0,RSTART+RLENGTH) 
    } 
    { print } 
' 

就個人而言,我會用比賽去()/ SUBSTR()因爲我討厭擺脫逃跑的角色。

而只是爲了循環回輪我們開始的地方,這裏是你怎麼能寫,作爲一個班輪,如果你喜歡:

awk -v userName="$4" -v password="$5" -v test="$test" '{ 
    print (match($0,/<jobResulsDir/) ? substr($0,1,RSTART) "<CommCellUser userName=\"" userName "\"password=\"" password "\" </CommCellUser> \"" test "\" <jobResulsDir " substr($0,RSTART+RLENGTH) : $0) 
}' 
+0

謝謝它的工作正常:) :)。即使我被困在獲得相同的stetted值。現在設置用戶名和密碼。如果我必須讀取xml文件並將值返回到雙引號中,我該怎麼做?(值包含特殊字符) – user12345

+0

對不起,我不知道你在問什麼。請更新您的原始帖子,以便用一些小樣本輸入(包括wget命令的輸出)和預期輸出來陳述您的新問題,或者更好地發佈新問題,因爲您的原始問題現在已解決。 –

+0

確定:)感謝您的幫助 – user12345

0

爲什麼不使用Perl的?它必須是一個shell腳本。

#!/usr/bin/perl 
    use XML::Simple; 
    use Data::Dumper; 
    open(my $XML_IN, '<', '/xml/file/path.xml'); 
    $/=undef; 
    my $xml_ref = XMLIn(<$XML_IN>); 
    print Dumper \$xml_ref; 
    # ... access $xml_ref in appropriate location, adding element/value 
    my $new_xml = XMLout($xml_ref); 
    close $XML_IN; 
    open(my $XML_OUT, '>', '/xml/file/path.xml'); 
    print $XML_OUT $new_xml; 
    close $XML_OUT; 
+0

是的,我必須使用shell腳本 – user12345

0

你正在嘗試與SED的意願去做撕掉你的大腦,你將不得不使用一個backslas h在每個特殊角色之前讓它工作。我使用m4進行這種工作。看一個例子:

define(your_macro_name,<Delete> 
<Object fdn="SubNetwork=somemoredata`,SubNetwork=somedata'`,ManagedElement'=$1"/> 
</Delete>)dnl 

保存在文件上面的代碼名爲「xmlmacros.m4」 然後創建一個名爲「test.m4」,並添加以下內容:

include(xmlmacros.m4)dnl 
your_macro_name(YOURXMLVALUE) 

如果兩個文件都在同一個文件夾,你可以運行m4 test.m4,你的輸出將是:

<Delete> 
<Object fdn="SubNetwork=somemoredata,SubNetwork=somedata,ManagedElement=YOURXMLVALUE"/> 

其中$1將由值在parenthe被替換sis的「test.m4」文件。您還可以添加更多定義,按需創建xml文件,例如xml標題等。

以上是您可以使用的工作示例。你可以四處看看有關m4的更多信息,我總是用它來做這種類型的工作。

+0

我也沒有正確地粘貼東西:在我給出的例子中,命令輸出將以結束XML標記結束:'' – Arribah