【问题标题】:Search expression and replace next line in multiple files搜索表达式并替换多个文件中的下一行
【发布时间】:2021-08-26 15:39:42
【问题描述】:

我想替换特定依赖的多个 pom.xml 文件的版本号。

据我了解:

sed 用于替换一行中的字符串,我很难替换下一行。

awk 用于多行。但是,在将其与 find 一起使用时,我很难替换文本。到目前为止,我想出了这个解决方案,但我不知道如何替换文件中的字符串? awk 是否适合我的目的?

$ find . -name "pom.xml" -exec \
awk -v artifactId="junit" -v RS="<dependency>" '
    $0 ~ "<artifactId>" artifactId "</artifactId>" {
        sub("<version>.*</version>", "<version>NEW-VERSION</version>")
    }
    { printf "%s", $0 RS }
' {} \;

输入是典型的 pom.xml 文件:

...
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>VARIOUS DIFFERENT VERSION NUMBERS HERE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
...

预期输出:

...
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>NEW-VERSION</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
...

我离开了 Eds 编辑,因为它使查询更具可读性,尽管 Williams comment 我留下了这个问题,这不是版本管理的正确工具。

【问题讨论】:

标签: awk


【解决方案1】:

我不明白您为什么不知道如何执行此操作,因为您为versionId 所做的一切与您为artifactId 所做的完全一样。

  1. 在对 awk 的调用中添加 -v versionId="NEW-VERSION",就像使用 -v artifactId="junit" 一样,并且
  2. 在子替换中使用 versionId 作为 "&lt;version&gt;" versionId "&lt;/version&gt;",就像你在条件中使用 artifactId 在它之前"&lt;artifactId&gt;" artifactId "&lt;/artifactId&gt;"
awk -v artifactId="junit" -v versionId="NEW-VERSION" -v RS="<dependency>" '
    $0 ~ "<artifactId>" artifactId "</artifactId>" {
        sub("<version>.*</version>", "<version>" versionId "</version>")
    }
    { printf "%s", $0 RS }
' pom.xml
...
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>NEW-VERSION</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2011-08-11
    • 2014-08-16
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多