首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed或Perl对XML块进行注释的Regex

使用sed或Perl对XML块进行注释的Regex
EN

Stack Overflow用户
提问于 2021-11-30 18:03:53
回答 2查看 94关注 0票数 0

我试图在web.xml的openAM内部使用sedperl -pi (我唯一可用的工具)来评论一个部分。

所以,我会在这里复印:

代码语言:javascript
复制
  <servlet-mapping>
    <servlet-name>AgentConfigurationServlet</servlet-name>
    <url-pattern>/agentconfig/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>VersionServlet</servlet-name>
    <url-pattern>/ccversion/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>FSServlet</servlet-name>
    <url-pattern>/federation/*</url-pattern>
  </servlet-mapping>

但我只想评论一下<servlet-mapping>...</servlet-mapping> (但只有/ccversion中的那个)。我什么都试过了,但没能成功。

我试过的是:

代码语言:javascript
复制
sed -e "s/(<servlet-mapping>[\r\n]+.*[\r\n]+.*\/ccversion.*[\r\n]+.*)/<\!-- \$1 -->/"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-30 18:13:20

您应该使用XML感知工具来处理XML。提到Perl,有几个XML处理模块可用。

但是,如果你坚持,冒着自己的风险尝试以下几点:

代码语言:javascript
复制
perl -0777 -pe 's{.*\K(<servlet-mapping>\s*.*?<url-pattern>/ccversion/.*?</servlet-mapping>)}{<!-- $1 -->}s' file.xml
  • -0777以"slurp模式“读取文件,即读取整个文件,而不是逐行处理;
  • 最初的.*\K是为了匹配和忘记我们感兴趣的<servlet-mapping>之前的一切;
  • .*?只需要问号(“节约量词”)来匹配最近的<url-pattern>,同样地,第二个问号需要匹配到最近的</servlet-mapping>,而不是匹配到最后一个;
  • 最后一个}s修饰符更改点以匹配换行符。

顺便说一句,在xsh中,我碰巧维护的XML::LibXML的包装器,也可以用它来处理。

代码语言:javascript
复制
open file.xml ;
for my $sm in //servlet-mapping[url-pattern="/ccversion/*"]
    xinsert comment {"$sm"} replace $sm ;
save :b ;    
票数 3
EN

Stack Overflow用户

发布于 2021-12-04 00:37:09

因为有人不得不这样说,所以我需要实践:)下面是如何使用libxml身份转换来实现它:

comment.xsl

代码语言:javascript
复制
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/info/servlet-mapping[url-pattern[text()='/ccversion/*']]">
        <xsl:text disable-output-escaping="yes">&lt;!-- </xsl:text>
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        <xsl:text disable-output-escaping="yes"> --&gt;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

xsltproc comment.xsl input.xml

输出

代码语言:javascript
复制
<?xml version="1.0"?>
<info>
    <servlet-mapping>
        <servlet-name>AgentConfigurationServlet</servlet-name>
        <url-pattern>/agentconfig/*</url-pattern>
    </servlet-mapping>
    <!-- <servlet-mapping>
        <servlet-name>VersionServlet</servlet-name>
        <url-pattern>/ccversion/*</url-pattern>
    </servlet-mapping> -->
    <servlet-mapping>
        <servlet-name>FSServlet</servlet-name>
        <url-pattern>/federation/*</url-pattern>
    </servlet-mapping>
</info>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70174066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档