【问题标题】:AIX: Parse XML and print element value to console on conditionAIX:解析 XML 并将元素值打印到控制台
【发布时间】:2021-04-18 12:09:45
【问题描述】:

我正在尝试解析一个结构类似于 XML 的 .conf 文件(我知道...)。每个标签在 xml 文件中都是唯一的。示例配置可能如下所示(请注意,一个 arg 可以有多个用逗号分隔的值):

<?xml version="1.0" encoding="..."?>
<conf>
    <id>123</id>
    <args>arg1=value1 arg2=value21,value22 arg3=value3 ...</args>
    <someotherstuff>abc</someotherstuff>
    <labels>label1,label2</labels>
    <someotherstuff2>def</someotherstuff2>
</conf>

我想做的事:

如果该文件的labels 包含label2,我想遍历包含所有配置(非递归)的文件夹并打印&lt;args&gt; 的值。如果文件不包含标签,则可以跳过。 AIX 是使用的操作系统。

我的尝试:

没有安装 XML 解析器,也无法安装。 grep 已安装,但除非我严重错误,否则它无法完成此任务。因此,我一直在查找有关 awk 和 sed 的信息。

find . -type f -name "*.conf" -exec sed -n -e '/<args>/,/<\/labels>/d; p' {} +;

...是我发现的。具有讽刺意味的是,这不会返回从argsopening 标记到labels 结束标记的范围,而是文件中的所有其他内容。有人可以给我一个提示吗?然后,我计划通过 1p;$p 简单地打印第一行 (=args) 和最后一行 (=labels)。

提前谢谢你。

【问题讨论】:

    标签: bash awk sed xml-parsing aix


    【解决方案1】:

    您可以尝试使用 awk 匹配 args 标签并保存该行,然后与标签行相同,然后匹配 'label2' 并打印 args:

    awk '/<args>/{ARGS=$0;}/<labels>/{LABELS=$0}END{if(LABELS ~ /label2/){print ARGS;}}'
    

    【讨论】:

    • 谢谢。与 Raman Sailopal 相比,它的简单性和更高的可读性被标记为解决方案(我知道它是语言的本质)。
    【解决方案2】:

    试试:

    sed -En '/args/h;/labels/{/label2/{g;s/(^.*args>)(.*)(<\/args>$)/\2/p}}'
    

    搜索带有“args”的行并添加到保留空间。然后搜索“标签”。如果有“labels2”,则将保持空间复制到模式空间并将该行分成三个部分,并将该行仅替换为第二部分(值)。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 1970-01-01
      • 2016-06-15
      • 2013-12-13
      • 1970-01-01
      • 2011-01-30
      • 2016-07-20
      相关资源
      最近更新 更多