J'ai besoin de faire cela en utilisant un script ou une commande Unix Il y a un fichier xml dans/home/user/app/xmlfiles comme
<book>
<fiction type='a'>
<author type=''></author>
</fiction>
<fiction type='b'>
<author type=''></author>
</fiction>
<Romance>
<author type=''></author>
</Romance>
</book>
Je veux éditer le type d'auteur dans la fiction en tant que local.
<fiction>
<author type='Local'></author>
</fiction>
Je dois changer le type d’auteur qui est dans la balise de fiction avec l’attribut b uniquement. Aidez-moi avec ceci en utilisant un script ou une commande shell unix. Merci !
Si vous souhaitez simplement remplacer <author type=''><\/author>
par <author type='Local'><\/author>
, vous pouvez utiliser cette commande sed
:
sed "/<fiction type='a'>/,/<\/fiction>/ s/<author type=''><\/author>/<author type='Local'><\/author>/g;" file
Mais, lorsque je traite avec XML, je recommande un analyseur/éditeur XML comme 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>
Utilisez l'indicateur -L
pour modifier le fichier en ligne, au lieu d'imprimer les modifications.
Nous pourrions utiliser un document xsl-document doThis.xsl
et traiter le source.xml
avec xsltproc
dans un newFile.xml
.
Le xsl est basé sur la réponse à cette question .
Mettez ceci dans un fichier doThis.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<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>
Maintenant nous produisons le newFile.xml
$: xsltproc -o ./newFile.xml ./doThis.xsl ./source.xml
Ce sera le 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>
L'expression utilisée pour trouver la fiction de type b est XPath
.
C'est assez facile avec sed
. Le script suivant modifie le contenu du fichier a.xml
et place l'original à a.bak
en tant que sauvegarde.
Cela permet de rechercher la chaîne <author type=''>
dans chaque fichier et de la remplacer par <author type='Local'>
. Le modificateur /g
signifie qu'il essaiera de faire plus d'un remplacement sur chaque ligne si possible (inutile pour votre fichier d'exemple).
sed -i.bak "s/<author type=''>/<author type='Local'>/g" a.xml
xmlstarlet edit --update "/book/fiction[@type='b']/author/@type" --value "Local" book.xml