【问题标题】:Uncomment XML File取消注释 XML 文件
【发布时间】:2020-09-27 01:14:49
【问题描述】:

我正在尝试自动化 Adob​​e CC Cleaner 工具的创建方式,然后要求管理员取消注释特定行或在我们的情况下为每个产品的所有行取消注释,以便按照 macOS 的 here 指示进行全面清理。

我想知道如何删除/取消注释 <!-- 仅在每个产品/行上具有前导空格和 --> 而不会影响其他行。

这里是使用 Adob​​e CC 2020 产品上的工具生成 cleanup.xml 文件后的输出示例:

    <?xml version="1.0" encoding="UTF-8"?>
<Products>
    <Properties>
        <Property name="eulaAccepted">1</Property>
    </Properties>
    <CreativeCloud>
        <!--<Product productName="AdobeCreativeCloud" version="2.0"/>-->
        <!--<Product productName="After Effects" version="17.0.5"/>-->
        <!--<Product productName="Camera Raw" version="12.2"/>-->
        <!--<Product productName="STI_Color_MotionPicture_HD" version="1.2"/>-->
        <!--<Product productName="STI_ColorCommonSet_RGB_HD" version="1.1"/>-->
        <!--<Product productName="Bridge" version="10.0.3"/>-->
        <!--<Product productName="Illustrator" version="24.0.3"/>-->
        <!--<Product productName="CoreSync" version="4.3.34"/>-->
        <!--<Product productName="InDesign" version="15.0.2"/>-->
        <!--<Product productName="Photoshop" version="21.1.1"/>-->
        <!--<Product productName="HD_ASU" version="2.0"/>-->
        <!--<Product productName="Lightroom" version="3.2"/>-->
        <!--<Product productName="Media Encoder" version="14.0.4"/>-->
        <!--<Product productName="CCX Process" version="3.5.1"/>-->
        <!--<Product productName="Premiere Pro" version="14.0.4"/>-->
        <!--<Product productName="CC Library" version="3.7.4"/>-->
    </CreativeCloud>
    <AAM></AAM>
    <AdobeIdCredentials></AdobeIdCredentials>
    <CS6></CS6>
    <CS5></CS5>
    <CS4></CS4>
    <CS3></CS3>
</Products>

尝试按照herehere 提供的说明进行反向操作,但没有成功。对此的任何帮助将不胜感激?????????

【问题讨论】:

  • 你为什么要用sed这样的面向行的工具来解析xml而不是像xmlstartletxmllint这样的语法感知解析器或使用xpath
  • @Inian 我认为这样的工具无法执行与 OP 想要的 cmets 相关的任务。我想我们会看看他们是否使用其中一种工具得到答案。

标签: xml bash sed adobe


【解决方案1】:

试试

使用xmlstarlet

xmlstarlet ed -d '//comment()' 

使用 sed

sed '/Product/ s#<!--##g;s#-->##g;'

演示:

echo  '<!--<Product productName="AdobeCreativeCloud" version="2.0"/>-->' | sed '/Product/ s#<!--##g;s#-->##g;' 
<Product productName="AdobeCreativeCloud" version="2.0"/>


【讨论】:

  • 这不是这样做的方法。请参阅 Inian 的 comment
  • 您的 xmlstarlet 命令删除 cmets - OP 说 "uncomment"
【解决方案2】:

假设您的实际输入与您在示例中显示的一样简单和常规,那么您可以使用任何 sed:

$ sed 's/<!--\(.*\)-->/\1/' file
    <?xml version="1.0" encoding="UTF-8"?>
<Products>
    <Properties>
        <Property name="eulaAccepted">1</Property>
    </Properties>
    <CreativeCloud>
        <Product productName="AdobeCreativeCloud" version="2.0"/>
        <Product productName="After Effects" version="17.0.5"/>
        <Product productName="Camera Raw" version="12.2"/>
        <Product productName="STI_Color_MotionPicture_HD" version="1.2"/>
        <Product productName="STI_ColorCommonSet_RGB_HD" version="1.1"/>
        <Product productName="Bridge" version="10.0.3"/>
        <Product productName="Illustrator" version="24.0.3"/>
        <Product productName="CoreSync" version="4.3.34"/>
        <Product productName="InDesign" version="15.0.2"/>
        <Product productName="Photoshop" version="21.1.1"/>
        <Product productName="HD_ASU" version="2.0"/>
        <Product productName="Lightroom" version="3.2"/>
        <Product productName="Media Encoder" version="14.0.4"/>
        <Product productName="CCX Process" version="3.5.1"/>
        <Product productName="Premiere Pro" version="14.0.4"/>
        <Product productName="CC Library" version="3.7.4"/>
    </CreativeCloud>
    <AAM></AAM>
    <AdobeIdCredentials></AdobeIdCredentials>
    <CS6></CS6>
    <CS5></CS5>
    <CS4></CS4>
    <CS3></CS3>
</Products>

或者,如果您确实只需要将其应用于以空格开头的行,那么对于 ERE 使用 GNU 或 OSX/BSD sed for -E

sed -E 's/^([[:space:]]+)<!--(.*)-->/\1\2/' file

或使用任何 POSIX sed:

sed 's/^\([[:space:]]\{1,\}\)<!--\(.*\)-->/\1\2/' file

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多