2015-06-05 26 views
-1

我有一個看起來像這樣一個XML文件,我只想要替換/裝運期/ ShipHdr/ShipmentX最後一次出現:Linux的bash腳本 - 替換字符串中最後一次出現在文件中

<ShipmentX> 
    <ShipHdr> 
    <RefID>REF01</RefID> 
    <HeaderReferenceNumber>1234565</HeaderReferenceNumber> 
    <Shipment> 
    <RefCode>GHIJK</RefCode> 
    <ShipmentStatusCode>FG</ShipmentStatusCode> 
    </Shipment> 
    <Summary> 
    <TotalWeight>10</TotalWeight> 
    </Summary> 
</Shipment> 

輸出:

<ShipmentX> 
    <ShipHdr> 
    <RefID>REF01</RefID> 
    <HeaderReferenceNumber>1234565</HeaderReferenceNumber> 
    <Shipment> 
    <RefCode>GHIJK</RefCode> 
    <ShipmentStatusCode>FG</ShipmentStatusCode> 
    </Shipment> 
    <Summary> 
    <TotalWeight>10</TotalWeight> 
    </Summary> 
    </ShipHdr> 
</ShipmentX> 

我如何能做到這一點用perl或者bash腳本sed的任何意見?

謝謝!

+0

試試'perl -pe's/<\/Shipment> \ s * $/<\/ShipHdr> \ n <\/ShipmentX> /''。 –

+0

這不會產生所需的結果,因爲它也會替換第一個出現的以及最後一個 – user3152289

回答

1

使用tacawk

tac xml | awk '!p && /<\/Shipment>/{p=1;print "</ShipmentX>\n </ShipHdr>"; next} 1'| tac 
<ShipmentX> 
    <ShipHdr> 
    <RefID>REF01</RefID> 
    <HeaderReferenceNumber>1234565</HeaderReferenceNumber> 
    <Shipment> 
    <RefCode>GHIJK</RefCode> 
    <ShipmentStatusCode>FG</ShipmentStatusCode> 
    </Shipment> 
    <Summary> 
    <TotalWeight>10</TotalWeight> 
    </Summary> 
    </ShipHdr> 
</ShipmentX> 
+1

謝謝,該工作!打印命令後,我只好切換ShipmentX和ShipHdr。 – user3152289

0

在Perl的正則表達式是$n =~ s/(?s).*\K<\/Shipment>/<\/ShipHdr> <\/ShipmentX>/;

或者,你可以避開LTS這個語法:

$n =~ s{(?s).*\K</Shipment>}{</ShipHdr> </ShipmentX>};

此正則表達式僅發現最後發生無論發生什麼後,即。之後不會有其他的</Shipment>

+0

出於某種原因,我無法工作。我試過'perl -pi -e's {(?s)。* \ K} {}「$ file' – user3152289

+0

@ user3152289 - 我懷疑你做錯了什麼。 – sln

相關問題