Использование xsltpro c ( Предлагаемое решение! ):
Наличие файла XLST transform.xsl
:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Matches the SpecialTag -->
<xsl:template match="SpecialTag">
<xsl:copy>
<!-- The number is available using node() and format-number() applies the 0-padding -->
<xsl:value-of select="format-number(node(), '00000')" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Запустите при условии, что input.xml
содержит ваши XML:
$ xsltproc transform.xml input.xml
Небезопасные решения:
Они основаны на том факте, что открывающий тег <SpecialTag>
и закрывающий тег </SpecialTag>
включены та же самая строка и что в каждой строке есть только один из них.
Ниже приведены решения только , поскольку автор явно пометил вопрос с помощью sed / bash / ракушка . Это не подходящие инструменты для достижения этой цели !
Все они работают с регулярными выражениями для перехвата <SpecialTag>
, за которыми следуют несколько чисел, затем </SpecialTag>
и преобразование чисел, перехваченных с помощью Версия этих чисел с добавлением 0.
Использование sed :
sed --regexp-extended 's@<SpecialTag>([0-9]+)</SpecialTag>@<SpecialTag>0000000\1</SpecialTag>@;s@0*([0-9]{5,})@\1@'
Использование perl:
perl -pe 's@<SpecialTag>([0-9]+)</SpecialTag>@sprintf("<SpecialTag>%05d</SpecialTag>",$1)@e'
Использование awk :
awk '{gsub( /<SpecialTag>[0-9]+<\/SpecialTag>/, sprintf("<SpecialTag>%05d</SpecialTag>", gensub(/[^0-9]/, "","g"))); print}'