2015-06-05 2 views
-1

У меня есть XML-файл, который выглядит примерно так, и я только хочу, чтобы заменить последнее вхождение/пересылки с/ShipHdr/ShipmentX:Linux Баш скрипт - Заменить последнее вхождение строки в файле

<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 или SED в Баш скрипт?

Спасибо!

+0

Попробуйте 'perl -pe 's/<\/Shipment> \ s * $/<\/ShipHdr> \ n <\/ShipmentX> /''. –

+0

Это не дает желаемого результата, потому что он также заменяет первое появление вместе с последним – user3152289

ответ

1

Использование tac и awk:

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>, независимо от того, что происходит после него, т.е. после него не будет другого </Shipment>.

+0

По какой-то причине я не могу работать. Я попробовал 'perl -pi -e 's {(? S). * \ K} {}" $ file' – user3152289

+0

@ user3152289 - Я подозреваю, что вы что-то делаете неправильно. – sln

Смежные вопросы