首页 > 解决方案 > 如果包含带有 sed 的某些字符串,则删除 xml 节点

问题描述

我目前正在尝试从 xml 文件中删除包含特定模式的所有节点。

我需要删除所有块:

<artifactItem>...</artifactItem> containing libprogram-* in <artifactId>libprograms-*</artifactId>

这是xml(只是开始):

 <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <!--
        <parent>
            <groupId>lu.foyer.exzos</groupId>
            <artifactId>exzos</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        -->
        <groupId>lu.foyer.exzos</groupId>
        <artifactId>foyer-pms</artifactId>
        <version>1.0-SNAPSHOT</version>
        <name>Foyer Pms</name>

        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>3.1.2</version>
                    <executions>
                        <execution>
                            <id>copy</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <!--outputDirectory>${project.basedir}/run/programs</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>true</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                        <excludeTransitive>true</excludeTransitive-->
                        <artifactItems>
                            <!-- Programs dependencies -->
                            <artifactItem>
                                <groupId>lu.foyer.exzos</groupId>
                                <artifactId>XactAnubexSyncJavaSupLib</artifactId>
                                <version>1.0-SNAPSHOT</version>
                                <outputDirectory>${project.basedir}/run/programs</outputDirectory>
                                <destFileName>XactAnubexSyncJavaSupLib.jar</destFileName>
                            </artifactItem>
                            <artifactItem>
                                <groupId>exzos.bazel</groupId>
                                <artifactId>libprograms-client-cobol</artifactId>
                                <version>1.0-SNAPSHOT</version>
                                <outputDirectory>${project.basedir}/run/programs</outputDirectory>
                                <destFileName>libprograms-client-cobol.jar</destFileName>
                           </artifactItem>
                        ...

我尝试了几个 sed 命令,但没有成功。

任何帮助,将不胜感激。

谢谢

标签: xmllinuxsed

解决方案


sed 是该工作的错误工具。使用 XSLT 或其他一些可识别 XML 的工具,例如 xmlstarlet 或 Saxon 的 Gizmo。

例如,在 Gizmo 中:

java net.sf.saxon.Gizmo -s:input.xml
/>delete //artifactItem[matches(., 'libprogram-*')]
/>save output.xml
/>quit

推荐阅读