shell 如何使用xmlstarlet查找字符串、删除对应节点和追加两个节点

b4qexyjb  于 2023-02-09  发布在  Shell
关注(0)|答案(2)|浏览(187)

我有一个名为FILE.XML的文件
它看起来像这样

<File>${IB}/OP/views/ACCOUNT.xml</File>
      <File>${IB}/OP/views/EMPLOYEES.xml</File
      <File>${IB}/OP/views/STATUS.xml</File>

我需要使用xmlstarlet来查看FILE.XML并确定是否存在ACCOUNT.xml的匹配项。如果存在,则在其下面追加两行,包括标记和完整路径,如下所示。

<File>${IB}/OP/views/ACCOUNT_MAIN.xml</File>
<File>${IB}/OP/views/ACCOUNT_SECONDARY.xml</File>

然后删除ACCOUNT.xml行

<File>${IB}/OP/views/ACCOUNT.xml</File>

所以我想出了一个删除行的方法,但不确定如何在删除之前或之后附加新的行。
这是我的删除命令。

xmlstarlet ed -L -d '//rules/File[contains(text(),"{IB}/OP/view/ACCOUNT.xml")]' ${HOME}/file.xml

FILE.xml中的最终结果应如下所示

<File>${IB}/OP/views/ACCOUNT_MAIN.xml</File>
      <File>${IB}/OP/views/ACCOUNT_SECONDARY.xml</File>
      <File>${IB}/OP/views/EMPLOYEES.xml</File
      <File>${IB}/OP/views/STATUS.xml</File>
pgpifvop

pgpifvop1#

给定此输入,

<rules>
  <File>${IB}/OP/views/ACCOUNT.xml</File>
  <File>${IB}/OP/views/EMPLOYEES.xml</File>
  <File>${IB}/OP/views/STATUS.xml</File>
</rules>

这应该能达到你的目的

# shellcheck shell=sh disable=SC2016
xmlstarlet edit \
  --var T '//rules/File[contains(text(),"${IB}/OP/views/ACCOUNT.xml")]' \
  -a '$T' -t elem -n 'File' -v '${IB}/OP/views/ACCOUNT_SECONDARY.xml' \
  -a '$T' -t elem -n 'File' -v '${IB}/OP/views/ACCOUNT_MAIN.xml' \
  -d '$T' \
file.xml

--var定义命名变量,请参见xmlstarlet.txt中的示例。如果T变量不匹配任何内容,则不修改输入。

tuwxkamq

tuwxkamq2#

输入
<root>
  <File>${IB}/OP/views/ACCOUNT_MAIN.xml</File>
  <File>${IB}/OP/views/ACCOUNT_SECONDARY.xml</File>
  <File>${IB}/OP/views/EMPLOYEES.xml</File
  <File>${IB}/OP/views/STATUS.xml</File>
</root>
我会怎么做:
xmlstarlet ed -L \
  -a '//File[contains(., "ACCOUNT.xml")]' -t elem -n File \
  -v '${IB}/OP/views/ACCOUNT_SECONDARY.xml' \
  -a '//File[contains(., "ACCOUNT.xml")]' -t elem -n File \
  -v '${IB}/OP/views/ACCOUNT_MAIN.xml' \
  -d '//File[contains(., "ACCOUNT.xml")]' file.xml
输出
<?xml version="1.0"?>
<root>
  <File>${IB}/OP/views/ACCOUNT_MAIN.xml</File>
  <File>${IB}/OP/views/ACCOUNT_SECONDARY.xml</File>
  <File>${IB}/OP/views/EMPLOYEES.xml</File>
  <File>${IB}/OP/views/STATUS.xml</File>
</root>

相关问题