Para uma solução sed
, veja mais abaixo nesta resposta.
Supondo que os a
são parte de um documento XML bem formado e que você deseja anexar .xhtml
ao valor de suas tags href
quando os valores existentes começarem com /entry/
:
xml ed -u '//a[starts-with(@href, "/entry/")]/@href' \
-x 'concat(../@href,".xhtml")' file.xml >file-new.xml
Isso usa XMLStarlet (às vezes instalado como xmlstarlet
em vez de apenas xml
) e ele encontrará o% relevantea
nós e acrescentar .xhtml
aos seus atributos href
, independentemente de onde no documento eles ocorrem.
O resultado é salvo em um novo arquivo aqui, mas você pode usar xml ed --inplace ...
para editar o arquivo no lugar depois de ter certeza de que funciona.
Teste:
$ cat file.xml
<?xml version="1.0"?>
<root>
<a href="/entry/someFile1"/>
<a href="/entry/someFile2"/>
<a href="/entry/someFile3"/>
</root>
$ xml ed -u '//a[starts-with(@href, "/entry/")]/@href' -x 'concat(../@href,".xhtml")' file.xml
<?xml version="1.0"?>
<root>
<a href="/entry/someFile1.xhtml"/>
<a href="/entry/someFile2.xhtml"/>
<a href="/entry/someFile3.xhtml"/>
</root>
Usando sed
(o que você não usa normalmente em um arquivo XML bem formado):
sed 's|<a href="/entry/[^"]*|&.xhtml|g' file.xml
Isso corresponde à string <a href="/entry/
seguido por qualquer número de caracteres que não são "
(esse seria o nome do arquivo). Essa parte inteira correspondente é então substituída por si mesma e pela string .xhtml
.
Com sed -i
, isso tornaria a modificação em vigor.
Teste (no mesmo arquivo acima):
$ sed 's|<a href="/entry/[^"]*|&.xthml|g' file.xml
<?xml version="1.0"?>
<root>
<a href="/entry/someFile1.xhtml"/>
<a href="/entry/someFile2.xhtml"/>
<a href="/entry/someFile3.xhtml"/>
</root>