【问题标题】:Unix - Uncomment xml commentsUnix - 取消注释 xml 注释
【发布时间】:2015-09-19 02:21:31
【问题描述】:

我有来自 XML 文件的以下节点。如何使用 Unix shell 脚本或命令取消注释第一次出现的 mainHost?

        <!-- Host without authentication -->
            <!-- <mainHost> <hostName>test.com</hostName> <httpPort>80</httpPort>
                    </mainHost> -->
            <!-- Host with authentication userId: User name of Host server Password:
                     -->
            <!-- <mainHost> <hostName>127.0.0.1</hostName> <httpPort>80</httpPort>
                    <userId>username</userId> <password>password</password>
                    </mainHost> -->

我已经尝试过使用不同变体的以下命令,但这似乎不起作用。

sed '0,/

标签: xml linux unix sed


【解决方案1】:

您在正确的轨道上(假设必须使用sed)。

创建一个包含以下内容的文件(例如script.sed):

0,/<\/mainHost>/{
  /<mainHost>/,/<\/mainHost>/{
    s/<!--//
    s/-->//
  }
}

然后运行sed -f script.sed FILE.xml

请注意,此解决方案难以概括。 sed 可能不是完成任务的最佳工具。

【讨论】:

  • 嗨 werkritter,如果 sed 不是正确的工具,有没有更好的选择来解决这个问题?
  • 我尝试了这个解决方案,但没有奏效。请问有什么想法吗?
  • 基于正则表达式的解决方案并不是解析和更改 XML 文件的最佳方式——它们往往很脆弱且难以扩展。例如,如果您想取消注释第二次出现的mainHost,则sed 脚​​本会复杂得多。使用 XML 的更好方法是使用主要编程语言中可用的一些标记处理工具和库。例如,在 Python 中,您可以在 xml.saxxml.domxml.etree 之间进行选择。不幸的是,我对这些工具不太了解。
  • 关于脚本不起作用:从上面的脚本中我准备了一个sed oneliner:sed '0,/&lt;\/mainHost&gt;/{/&lt;mainHost&gt;/,/&lt;\/mainHost&gt;/{s/&lt;!--//;s/--&gt;//}}' file.xml 请尝试一下。作为参考,我使用了 GNU sed,版本 4.2.2。
  • 感谢您的信息。这很有帮助。我将用 Python 编写一个脚本来解决这个问题。我正在使用 Redhat,但 sed 命令在那里不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 2013-03-11
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多