0

I have file, with tags. I need to change all the values of 'element name' from lowercase to uppercase. Where there are more than one variable in the tag, also keep on replacing only the 'element name' value.

Input File:

<element name="product-info">
  <element name="user-info" maxTimes="total-name">
    <maxHelp="user-help">

Requested Output File:

<element name="PRODUCT-INFO">
  <element name="USER-INFO" maxTimes="total-name">
    <maxHelp="user-help">
s-miral
  • 1
  • 1
  • 1
    XML cannot be reliably parsed with regular expressions. You might want to investigate using XSLT: https://stackoverflow.com/q/586231/7552 – glenn jackman Mar 07 '19 at 16:35

2 Answers2

1
sed 's/\([ \t\n\r\f]\)name="\([^"]*\)"/\1name="\U\2"/g' inputfile > outputfile

Or - to make it easier to read, use extended regular expressions:

sed -E 's/(\sname=")([^"]+")/\1\U\2/g' inputfile > outputfile
sborsky
  • 425
  • 2
  • 8
  • This will also uppercase the value for an attribute like `othername="something"` – glenn jackman Mar 07 '19 at 16:38
  • Please note that while this may be OK for the data file you have right now, it is dangerous to treat XML like it's plain text. See http://htmlparsing.com/regexes.html for examples of what can go wrong if your data is not in exactly the form you're seeing right now. – Andy Lester Mar 07 '19 at 17:32
0

After some googling and trial&error, XSLT:

$ cat file.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="element/@name">
        <xsl:attribute name="name">
            <xsl:value-of select="translate(., $lowercase, $uppercase)" />
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="product/@id"/>
</xsl:stylesheet>
$ cat file.xml
<root>
  <otherelement name="foo" />
  <element name="product-info">
    <element name="user-info" maxTimes="total-name">
      <element maxHelp="user-help">
      </element>
    </element>
  </element>
</root>
$ xsltproc file.xsl file.xml
<?xml version="1.0"?>
<root>
  <otherelement name="foo"/>
  <element name="PRODUCT-INFO">
    <element name="USER-INFO" maxTimes="total-name">
      <element maxHelp="user-help">
      </element>
    </element>
  </element>
</root>
glenn jackman
  • 238,783
  • 38
  • 220
  • 352