7

Мне нужно сделать это с помощью сценария или команды Unix. Существует файл XML в /home /user /app /xmlfiles, например

<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. Спасибо !

4 ответа4

14

Если вы просто хотите заменить <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 для редактирования встроенного файла, а не для печати изменений.

6

Мы могли бы использовать 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 .

2

Это довольно легко с sed . Следующий скрипт изменит содержимое файла a.xml и поместит оригинал в a.bak в качестве резервной копии.

Он ищет в каждом файле строку <author type=''> и заменяет ее на <author type='Local'> . Модификатор /g означает, что он попытается сделать более 1 замены в каждой строке, если это возможно (не требуется для вашего файла примера).

sed -i.bak "s/<author type=''>/<author type='Local'>/g" a.xml
-2
xmlstarlet edit --update "/book/fiction[@type='b']/author/@type" --value "Local" book.xml

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .