【问题标题】:Check occurence of two consecutive XML tag in Unix Shell检查 Unix Shell 中两个连续 XML 标记的出现
【发布时间】:2015-01-10 10:48:15
【问题描述】:

我有以下 XML 文件:

<PARENT_TAG>
    <CHILD_TAG>
        <DETAIL_1_TAG></DETAIL_1_TAG>
        <DETAIL_2_TAG></DETAIL_2_TAG>
        <DETAIL_3_TAG></DETAIL_3_TAG>
        <DETAIL_4_TAG></DETAIL_4_TAG>
    </CHILD_TAG>
</PARENT_TAG>

甚至可以格式化为

<PARENT_TAG><CHILD_TAG><DETAIL_1_TAG> ...  </CHILD_TAG></PARENT_TAG>

我想使用 grep、awk、sed 提取 xml 标记的名称。 在这种情况下,我会提取“CHILD_TAG”。

【问题讨论】:

  • 不清楚您的预期输出是什么。此外,使用 awk/sed 解析 xml 并不是最好的主意:考虑使用适当的 xml 解析器。
  • extract the name of the xml tag following 什么? &lt;PARENT_TAG&gt;?该块是否在您的输入文件中出现一次或多次? &lt;PARENT_TAG&gt; 可以出现在您不想提取它后面的标签的其他上下文中吗?它可以在&lt;...&gt; 中有任何关联的属性吗?如果可能发生任何此类或任何其他差异,请修改您的示例输入以显示这一点,并在任何情况下发布您的预期输出。

标签: xml shell awk grep ksh


【解决方案1】:

您可以通过以下方式获得所有内容:

awk '$1=$1' ORS="" file
<PARENT_TAG><CHILD_TAG><DETAIL_1_TAG></DETAIL_1_TAG><DETAIL_2_TAG></DETAIL_2_TAG><DETAIL_3_TAG></DETAIL_3_TAG><DETAIL_4_TAG></DETAIL_4_TAG></CHILD_TAG></PARENT_TAG>

但是如果你有更多的行,你需要设置一个开始和结束模式。

这是另一个例子:

cat file
test
<PARENT_TAG>
    <CHILD_TAG>
        <DETAIL_1_TAG></DETAIL_1_TAG>
        <DETAIL_2_TAG></DETAIL_2_TAG>
        <DETAIL_3_TAG></DETAIL_3_TAG>
        <DETAIL_4_TAG></DETAIL_4_TAG>
    </CHILD_TAG>
</PARENT_TAG>
more data

awk '/<PARENT/ {f=1} /<\/PARENT/ {f=0} {printf "%s%s",$1,(f?"":RS)}'
test
<PARENT_TAG><CHILD_TAG><DETAIL_1_TAG></DETAIL_1_TAG><DETAIL_2_TAG></DETAIL_2_TAG><DETAIL_3_TAG></DETAIL_3_TAG><DETAIL_4_TAG></DETAIL_4_TAG></CHILD_TAG></PARENT_TAG>
more

这只会删除PARENTtag 内的换行符。

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多