Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Unix命令行删除XML节点_Xml_Linux_Awk_Sed_Grep - Fatal编程技术网

使用Unix命令行删除XML节点

使用Unix命令行删除XML节点,xml,linux,awk,sed,grep,Xml,Linux,Awk,Sed,Grep,如果节点没有特定的标记,我需要从文件中删除节点。 如何使用awk、sed或grep仅保留具有名称标记的节点 输入: <node user="user1"> <tag k="name" v="name1"/> </node> <node user="user2"> <tag k="network" v="nw1"/> </node> 期望输出: <node

如果节点没有特定的标记,我需要从文件中删除节点。 如何使用awk、sed或grep仅保留具有名称标记的节点

输入:

    <node user="user1">
      <tag k="name" v="name1"/>
    </node>
    <node user="user2">
      <tag k="network" v="nw1"/>
    </node>
期望输出:

    <node user="user1">
      <tag k="name" v="name1"/>
    </node>

xmlstarlet和此文件file.xml的一些提示:

<root>
   <node user="user1">
      <tag k="name" v="name1"/>
    </node>
    <node user="user2">
      <tag k="network" v="nw1"/>
    </node>
   <node user="user3">
      <tag k="foo" v="bar"/>
    </node>
</root>
输出:

name1 nw1 bar
<?xml version="1.0"?>
<root>
  <node user="user2">
    <tag k="network" v="nw1"/>
  </node>
  <node user="user3">
    <tag k="foo" v="bar"/>
  </node>
</root>
<?xml version="1.0"?>
<root>
  <node user="user2">
    <tag k="network" v="nw1"/>
  </node>
</root>
   <node user="user1">
      <tag k="name" v="name1"/>
    </node>
输出:

name1 nw1 bar
<?xml version="1.0"?>
<root>
  <node user="user2">
    <tag k="network" v="nw1"/>
  </node>
  <node user="user3">
    <tag k="foo" v="bar"/>
  </node>
</root>
<?xml version="1.0"?>
<root>
  <node user="user2">
    <tag k="network" v="nw1"/>
  </node>
</root>
   <node user="user1">
      <tag k="name" v="name1"/>
    </node>
输出:

name1 nw1 bar
<?xml version="1.0"?>
<root>
  <node user="user2">
    <tag k="network" v="nw1"/>
  </node>
  <node user="user3">
    <tag k="foo" v="bar"/>
  </node>
</root>
<?xml version="1.0"?>
<root>
  <node user="user2">
    <tag k="network" v="nw1"/>
  </node>
</root>
   <node user="user1">
      <tag k="name" v="name1"/>
    </node>

如果您的文件真的那么简单,使用GNU awk实现多字符:

$ awk -v RS='</node>\n' '/v="name1"/{printf "%s%s", $0, RT}' file
    <node user="user1">
      <tag k="name" v="name1"/>
    </node>
使用GNU grep:

grep -Poz '.*<node .*\n.*<tag .*v="name1".*\n.*</node>' file.xml
输出:

name1 nw1 bar
<?xml version="1.0"?>
<root>
  <node user="user2">
    <tag k="network" v="nw1"/>
  </node>
  <node user="user3">
    <tag k="foo" v="bar"/>
  </node>
</root>
<?xml version="1.0"?>
<root>
  <node user="user2">
    <tag k="network" v="nw1"/>
  </node>
</root>
   <node user="user1">
      <tag k="name" v="name1"/>
    </node>

请将该示例输入的所需输出添加到您的问题中。不,您绝对不能使用awk、sed或grep来执行此操作。您可以使用xsltproc或xmlstarlet来实现这一点。请仔细阅读这些工具。还有,请问一个问题。目前这是一个编程作业,不是问题。@Tomalak我需要使用awk、grep或grep。不,你不需要。请给出一个合理的理由,说明为什么您需要使用命令行工具X,而更合适的命令行工具Y也已安装!,不能用,那不太可能。他们想解决一个问题,如果他们付钱给你,我敢肯定他们想妥善解决。如果你来到一家汽车修理店,你不需要告诉机修工该用哪种工具,同样,你的客户也不需要告诉你该用哪种工具。所以我不认为您真的处于那种情况。它不起作用,代码的输出是:tagk=name v=name1/>不,不是,请参见答案。如果您正在运行的任何程序都在生成该输出,那么您就没有针对您问题中的输入运行我的答案中的命令。我建议用RS-typo替换RT。谢谢,但我的输出仍然是:tag k=name v=name1/>好的。对于我的nawk,如果我使用RT,我会错过它。是的,它可以工作,但是如果我有几个输出节点,我怎么能插入换行符呢?对于grep,我不知道。我建议使用Ed Morton的awk解决方案并将%s%s替换为%s%s\n。请参阅我对他的解决方案的评论。他的答案有一个小的拼写错误。