读取 XML 标签,然后使用 shell 脚本删除 XML 标签

读取 XML 标签,然后使用 shell 脚本删除 XML 标签

给出以下输入:

<start>
   <header>
      This is header section
   </header>
   <body>
      <body_start>
         This is body section
         <a>
            <b>
               <c>
                  <st>111</st>
               </c>
               <d>
                  <st>blank</st>
               </d>
            </b>
         </a>
      </body_start>
      <body_section>
         This is body section
         <a>
            <b>
               <c>
                  <st>5</st>
               </c>
               <d>
                  <st>666</st>
               </d>
            </b>
            <b>
               <c>
                  <st>154</st>
               </c>
               <d>
                  <st>1457954</st>
               </d>
            </b>
            <b>
               <c>
                  <st>845034</st>
               </c>
               <d>
                  <st>blank</st>
               </d>
            </b>
         </a>
      </body_section>
   </body>
</start>

我想执行以下解析。

如果标签st的值为,则需要删除整个标签。请注意,文件中可能存在或不存在值 154。c154<b></b>

因此,如果存在值 154,则需要删除以下部分:

<b>
   <c>
      <st>154</st>
   </c>
   <d>
      <st>1457954</st>
   </d>
</b>

我想在 shell 脚本中编写代码。但我无法使用,xslt因为我的系统不支持它。

答案1

您可以使用pup,用于处理 HTML 的命令行工具。对于 XML,您可以使用xpup

例如,要查找要移除的部件,请运行:

$ pup ':parent-of(:parent-of(:contains("154")))' <file.html
<b>
 <c>
  <st>
   154
  </st>
 </c>
 <d>
  <st>
   1457954
  </st>
 </d>
</b>

sed要使用(file.html您的 HTML 文件在哪里)从输入中删除此部分,请运行:

 sed "s@$(pup ':parent-of(:parent-of(:contains("154")))' <file.html | xargs | tr -d " ")@@g" <(xargs <file.html | tr -d " ")

笔记:

  • 我们用来xargs <file.html | tr -d " "将文件压平为一行而没有空格。
  • 我们使用提到的pup命令来找到要删除的模式。
  • 我们使用sed以下方式删除模式:sed "s@PATTERN@@g" <(input)
  • 要就地替换(通过修改文件),-i对于 GNU添加sed,或者-i'.bak'对于 BSD添加sed

为了更容易理解,可以使用以下脚本:

function flat_it() { xargs | tr -d " "; }
input=$(flat_it <file.html)
remove=$(pup ':parent-of(:parent-of(:contains("154")))' <<<$input | flat_it)
sed "s@$remove@@g" <<<$input

注意:上述方法的缺点是所有空格都被删除,包括内容中的空格。为了改善这种情况,需要使用其他扁平化输入的方法。

因此xargs | tr -d " ",可以使用 或 来sed代替。expaste

以下是使用的示例ex

ex +%j +"s/[><]\zs //g" +%p -scq! file.html

以下是带 shell 功能的版本(可以替代以前的版本):

function flat_it() { ex +%j +"s/[><]\zs //g" +%p -scq! /dev/stdin; }

相关内容