【问题标题】:How to uncomment XML block with SED如何使用 SED 取消注释 XML 块
【发布时间】:2020-04-16 22:42:34
【问题描述】:

如何使用 SED 从我的 xml 文件中取消注释包含过滤器标签的块?只有这个块应该被取消注释。其他注释掉的代码应该留在原处。

<a> test <a>
<!--
<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <async-supported>true</async-supported>
</filter>-->

<!-- <b> leave this one alone </b>-->

【问题讨论】:

  • 在您的示例输入中,在上下文中显示您的目标注释块,周围是您不希望更改的其他类似注释和未注释块。那是您的示例输入。然后根据输入加上您迄今为止尝试过的内容添加您的预期输出,此时您将对此论坛提出一个很好的问题。如果您希望所有已注释的块都未注释或仅此一个,请明确说明。如果字符串&lt;!-- 和/或--!&gt; 可以出现在其他上下文中,则在示例中包含这些字符串。如果不清楚,请参阅How to Ask

标签: linux bash unix sed


【解决方案1】:

使用 GNU sed for -z,假设 &lt;!----&gt; 不会出现在其他上下文中,这将取消所有注释块的注释:

$ sed -z '
    s/@/@A/g; s/{/@B/g; s/}/@C/g; s/<!--/{/g; s/-->/}/g;
    s/{\([^}]*\)}/\1/g;
    s/}/-->/g; s/{/<!--/g; s/@C/}/g; s/{/@B/g; s/@A/@/g
' file
<a> test <a>

<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <async-supported>true</async-supported>
</filter>

 <b> leave this one alone </b>

如果您想取消注释某个特定块,请将s/{\([^}]*\)}/\1/g 修改为适合您的任何正则表达式,例如:

$ sed -z '
    s/@/@A/g; s/{/@B/g; s/}/@C/g; s/<!--/{/g; s/-->/}/g;
    s/{\([^}]*catalina[^}]*\)}/\1/g;
    s/}/-->/g; s/{/<!--/g; s/@C/}/g; s/{/@B/g; s/@A/@/g
' file
<a> test <a>

<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <async-supported>true</async-supported>
</filter>

<!-- <b> leave this one alone </b>-->

请参阅how to find a search term in source code,了解之前/之后的所有替换都在做什么。

【讨论】:

  • 谢谢。但是运行该命令只会在我的控制台上打印出整个 XML,并且文件不会被修改
  • 您不能也不得使用 shell 或 RegEx 引擎解析标记语言。关于 XML cmets:这些都是要处理的负担,因为 cmets 没有直接的 XPath 选择器,或者至少选择特定的注释节点是一个问题,因为它没有 ID,没有属性。只是一个原始字符串。见:Accessing Comments in XML using XPath
  • @LéaGris 如果你没有更强大的替代方案来建议,那么说“你不能也不能”这样做是没有用的。如果您确实有一个强大的替代帖子,那就太好了,让我们看看。
  • @corboamnesiac 是的,这就是命令默认执行的操作 - 将它们的输出打印到标准输出。如果要修改原始文件,则将输出重定向到临时文件,然后将临时文件移动到原始cmd file &gt; tmp &amp;&amp; mv tmp file。话虽如此,一些 sed 有一个 -i 选项可以在幕后为您执行此操作,因此请查看您的 sed 手册页,
  • 非常感谢 Ed Morton。我还有一个问题 - 我可以使用相同的命令将新标签插入到未注释掉的 xml 中吗?在取消注释后的过滤器标签中,我想插入 test true
猜你喜欢
  • 2014-06-08
  • 2016-01-08
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2015-09-19
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多