【发布时间】: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 我留下了这个问题,这不是版本管理的正确工具。
【问题讨论】:
-
Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
-
@jhnc 不幸的是,这些都是不同的项目。
-
使用有用的缩进和其他强调/支持程序控制流的空白来格式化代码总是很重要的,尤其是在要求其他人阅读时。请参阅我最近的编辑,了解一种清晰地布置代码的方法。
-
请edit 将您的问题包含在minimal reproducible example 中,其中包含简洁、可测试的样本输入和预期输出,以便我们为您提供帮助。如果不清楚,请参阅How to Ask。
标签: awk