2017-06-29 48 views
0

使用sed,awk或類似的 我有一個像下面的file.xml,我想從mytag的值恰好在如何使用sed,awk或類似的方式添加信息從搜索幾行以上使用sed,awk或類似

之前的tagxpto
<tagxpto field= /> 
    <tag1> 
    <tag2> 
    <mytag value="SUB1-SUB2" /> 
    <tagxpto field= /> 
    <tag1> 
    <tag2> 
    <mytag value="SUB3-SUB4" /> 
    <tagxpto field= /> 
    <tag1> 
    <tag2> 
    <mytag value="SUB5-SUB6" /> 
    [..] 

預計:

<tagxpto field="SUB1-SUB2" /> 
    <tag1> 
    <tag2> 
    <mytag value="SUB1-SUB2" /> 
    <tagxpto field=SUB3-SUB4 /> 
    <tag1> 
    <tag2> 
    <mytag value="SUB3-SUB4" /> 
    <tagxpto field=SUB5-SUB6 /> 
    <tag1>  
    <tag2>  
    <mytag value="SUB5-SUB6" /> 
    [..] 

你能幫助我如何做這個任務?

+0

輸入XML是無效的,錯誤的屬性'字段=' – RomanPerekhrest

+0

它的唯一的例子..有另一個屬性名.. –

+0

不會與無效的結構去,運氣好的話 – RomanPerekhrest

回答

0

這可能爲你工作(GNU SED):

sed -r '/tagxpto/{:a;N;/mytag/!ba;s/=(.*("[^"]*"))/=\2\1/}' file 

收拾起來,從tagxptomytag線,然後使用反向引用替換所需的字符串。

0

隨着GNU AWK的第三個參數匹配():

$ cat tst.awk 
NR==FNR { 
    if (match($0,/^\s*<mytag\s*value=("[^"]*")/,a)) { 
     tags[++myCnt] = a[1] 
    } 
    next 
} 
match($0,/^(\s*<tagxpto\s*field=)(.*\/>)/,a) { 
    $0 = a[1] tags[++xptoCnt] a[2] 
} 
{ print } 

$ awk -f tst.awk file file 
    <tagxpto field="SUB1-SUB2" /> 
    <tag1> 
    <tag2> 
    <mytag value="SUB1-SUB2" /> 
    <tagxpto field="SUB3-SUB4" /> 
    <tag1> 
    <tag2> 
    <mytag value="SUB3-SUB4" /> 
    <tagxpto field="SUB5-SUB6" /> 
    <tag1> 
    <tag2> 
    <mytag value="SUB5-SUB6" /> 

請注意,您發佈的預期輸出有時會添加字段引號內有時不是沒有的時候,包括引號,何時不解釋所以我認爲你總是希望它在引號中,如果你不這樣做,這是一個微不足道的調整,例如將捕獲組("[^"]*")更改爲"([^"]*)"

+0

之前我的行爲很奇怪,你的'awk'在cygwin中工作正常,但在redhat中不起作用,你知道爲什麼嗎? –

+0

cygwin使用GNU awk就像答案狀態是必需的。你在「redhat」上使用GNU awk嗎?檢查'awk --version' –

0

用awk嘗試一種方法,僅讀取Input_file單次。

awk '/<tagxpto field/ && val2{sub(/= /,"="val2,val1);print val1 ORS val;val1=$0;val=val2=""} NR==1{val1=$0;next} {val=val?val ORS $0:$0} /<mytag value/{match($0,/".*"/);val2=substr($0,RSTART,RLENGTH)} END{sub(/= /,"="val2,val1);print val1 ORS val}' Input_file 

在某個時候也會添加它的非線性格式和解釋。

編輯:添加的解非班輪一個形式太在這裏。

awk '/<tagxpto field/ && val2{ 
           sub(/= /,"="val2,val1); 
           print val1 ORS val; 
           val1=$0; 
           val=val2="" 
          } 
    NR==1{ 
       val1=$0; 
       next 
     } 
     { 
       val=val?val ORS $0:$0 
     } 
    /<mytag value/{ 
         match($0,/".*"/); 
         val2=substr($0,RSTART,RLENGTH) 
        } 
    END{ 
     sub(/= /,"="val2,val1); 
     print val1 ORS val 
     } 
    ' Input_file