Edit xml file using shell script / command
I need to do this using unix script or command There is a xml file in /home/user/app/xmlfiles like
<book> <fiction type='a'> <author type=''></author> </fiction> <fiction type='b'> <author type=''></author> </fiction> <Romance> <author type=''></author> </Romance>
</book>I want to edit author type in fiction as local .
<fiction> <author type='Local'></author> </fiction>I need to change the author type which is in fiction tag with attribute b alone. Please help me with this using unix shell script or command. Thanks !
54 Answers
If you just want to replace <author type=''><\/author> with <author type='Local'><\/author>, you can use that sed command:
sed "/<fiction type='a'>/,/<\/fiction>/ s/<author type=''><\/author>/<author type='Local'><\/author>/g;" fileBut, when dealing with xml, I recommend an xml parser/editor like xmlstarlet:
$ xmlstarlet ed -u /book/*/author[@type]/@type -v "Local" file
<?xml version="1.0"?>
<book> <fiction> <author type="Local"/> </fiction> <Romance> <author type="Local"/> </Romance>
</book>Use the -L flag to edit the file inline, instead to printing the changes.
xmlstarlet edit --update "/book/fiction[@type='b']/author/@type" --value "Local" book.xml 5 We could use a xsl-document doThis.xsl and process the source.xml with xsltproc into a newFile.xml.
The xsl is based on the answer to this question.
Put this into a doThis.xsl file
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="">
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no"/>
<!-- Copy the entire document -->
<xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy>
</xsl:template>
<!-- Copy a specific element -->
<xsl:template match="/book/fiction[@type='b']/author"> <xsl:copy> <xsl:apply-templates select="@*|node()"/>
<!-- Do something with selected element --> <xsl:attribute name="type">Local</xsl:attribute> </xsl:copy>
</xsl:template>
</xsl:stylesheet> Now we produce the newFile.xml
$: xsltproc -o ./newFile.xml ./doThis.xsl ./source.xml This will be the newFile.xml
<?xml version="1.0" encoding="UTF-8"?>
<book> <fiction type="a"> <author type=""/> </fiction> <fiction type="b"> <author type="Local"/> </fiction> <Romance> <author type=""/> </Romance>
</book>The expression used to find type b fiction is XPath.
It is quite easy with sed. The following script will change the contents of file a.xml and will put the original to a.bak as a backup.
What it does is it searches each file for the string <author type=''> and replaces it with <author type='Local'>. The /g modifier means that it will try to make more than 1 replacement on each line if possible (not needed for your example file).
sed -i.bak "s/<author type=''>/<author type='Local'>/g" a.xml 2