如何从命令行取消注释xml节点?

如何从命令行取消注释xml节点?,xml,regex,command-line,sed,awk,Xml,Regex,Command Line,Sed,Awk,选择所需节点的正则表达式如下: <!--\s*<env-entry>(.*\s*)*</env-entry>\s*--> 其中xml文件包含: <!-- <env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>/put/your/solr/home/here</env-en

选择所需节点的正则表达式如下:

<!--\s*<env-entry>(.*\s*)*</env-entry>\s*-->

其中xml文件包含:

<!--
    <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>/put/your/solr/home/here</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
   -->
<!--
    <other-entry>
    </other-entry>
   -->


如何取消对所选节点的注释(可能是使用sed/awk)?

这是一个粗略的解决方案,它可能在某些情况下存在错误,因此请仔细测试:

/<!--/ {
    comment = $0
    getline
    if ($0 !~ /<env-entry>/) print comment
}

/-->/ {
    if (last_line ~ /<\/env-entry>/) next
}

{
    last_line = $0
    print
}
//{
如果(最后一行~//)下一行
}
{
最后一行=$0
打印
}

更新:我忘了提到解决方案在AWK中,以防万一。

1。sed需要管理连接多个行,然后才能根据您的示例进行正则表达式匹配,这是一项只有有时间的勇敢者才能进行的练习。awk可能能做到。2.我注意到您在其他一些帖子中使用了xmlstarlet。那不行吗?3.你确定你问的问题是对的吗?感觉上,您真的需要一种从主cfg文件构建specfic cfg文件的方法。我认为有很多工具可以用于这种方法(但我没有使用它们的经验)。祝你好运