
Мне нужно сделать это с помощью скрипта или команды unix. В /home/user/app/xmlfiles есть файл xml, например
<book>
<fiction type='a'>
<author type=''></author>
</fiction>
<fiction type='b'>
<author type=''></author>
</fiction>
<Romance>
<author type=''></author>
</Romance>
</book>
Я хочу изменить тип автора в художественной литературе на местный.
<fiction>
<author type='Local'></author>
</fiction>
Мне нужно изменить тип автора, который находится втег фантастики с атрибутом bв одиночку. Пожалуйста, помогите мне с этим, используя скрипт или команду оболочки unix. Спасибо!
решение1
Если вы просто хотите заменить <author type=''><\/author>
на <author type='Local'><\/author>
, вы можете использовать эту sed
команду:
sed "/<fiction type='a'>/,/<\/fiction>/ s/<author type=''><\/author>/<author type='Local'><\/author>/g;" file
Но при работе с XML я рекомендую использовать XML-парсер/редактор, например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>
Используйте этот -L
флаг для редактирования файла в строке, а не для печати изменений.
решение2
xmlstarlet edit --update "/book/fiction[@type='b']/author/@type" --value "Local" book.xml
решение3
Мы могли бы использовать xsl-документ doThis.xsl
и обработать source.xml
его xsltproc
в newFile.xml
.
XSL основан на ответе на этот вопрос.вопрос.
Поместите это в 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>
Теперь мы производимnewFile.xml
$: xsltproc -o ./newFile.xml ./doThis.xsl ./source.xml
Это будет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>
Выражение, используемое для поиска художественной литературы типа B, — XPath
.
решение4
Это довольно просто с sed
. Следующий скрипт изменит содержимое файла a.xml
и поместит оригинал a.bak
в качестве резервной копии.
Что он делает, так это ищет строку в каждом файле <author type=''>
и заменяет ее на <author type='Local'>
. /g
Модификатор означает, что он попытается сделать более 1 замены в каждой строке, если это возможно (не требуется для вашего файла-примера).
sed -i.bak "s/<author type=''>/<author type='Local'>/g" a.xml