我的项目中有一些pom文件具有以下结构
<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/maven-v4_0_0.xsd">
<parent>
<artifactId>xparent</artifactId>
<groupId>y</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>someparent</artifactId>
<version>x.x.x-needs_change</version>
<packaging>pom</packaging>
<name>some name</name>
<description>some description</description>
<url>myurl</url>
<modules>
<module>mymodules</module>
</modules>
<properties>
<my.version>x.x.x-needs_change</my.version>
</properties>
<dependencies>
<dependency>
<groupId>hhhhh</groupId>
<artifactId>hhhhh</artifactId>
<version>x.x.x-should not change</version>
</dependency>
</dependencies>
</project>
我使用sed将当前版本作为输入并将其更改为给定的新版本。但我不想在依赖块中更改版本。我该怎么做呢?
我不想去maven版插件路由。我试过了,它不符合我的要求。
我更喜欢sed / python脚本。
由于
答案 0 :(得分:2)
你可以尝试:
sed -e '/<dependencies>/,/<\/dependencies>/ !{
s!<version>[0-9.]\+</version>!<version>'"$NEWVERSION"'</version>!
}' MY_FILE
/<dependencies>/,/<\/dependencies>/
说&#34;找到<dependencies>
和</dependencies>
&#34;之间的所有行。
!
之后说&#34;在但那些行执行以下操作(即对{em>除之外的所有行执行此操作}和<dependencies>
)&#34;。
</dependencies>
说&#34;将s!<version>[0-9.]\+</version>!<version>'"$NEWVERSION"'</version>!
替换为<version>...</version>
,其中<version>$NEWVERSION</version>
是包含新版本号的环境变量。
使用引号($NEWVERSION
)放屁是因为我想要sed命令主要部分的单引号(所以我不必担心感叹号和反斜杠),但我做希望扩展'"$NEWVERSION"'
。
修改以适合您的脚本。
答案 1 :(得分:1)
要解析和修改XML - 您真的应该使用xml感知解析器,例如lxml而不是sed
或awk
等文本工具
我认为您的POM文件确实是有效的POM文件,即它们也包含<project>
标记。
>>> t = """<project>
... <parent>
... <artifactID> </artifactID>
... <groupID> </groupID>
... <version>2.0.0</version>
... </parent>
...
... <properties>
... <version>2.0.0</version>
... </properties>
...
... <dependencies>
... <dependency>
... <version>2.0.0</version>
... </dependency>
... </dependencies></project>
... """
>>> from lxml import etree
>>> r = etree.fromstring(t)
>>> r.xpath("//parent/version")[0].text = "3.0"
>>> r.xpath("//properties/version")[0].text = "3.0"
>>> print(etree.tostring(r))
<project>
<parent>
<artifactID> </artifactID>
<groupID> </groupID>
<version>3.0</version>
</parent>
<properties>
<version>3.0</version>
</properties>
<dependencies>
<dependency>
<version>2.0.0</version>
</dependency>
</dependencies></project>
答案 2 :(得分:0)
nawk '{
a=$0;
getline;
if($0!~/depend/ && a!~/version/)
{gsub(/2.0.0/,"1.0.0",$0);print a"\n"$0}
else print a"\n"$0
}' file3
以下是测试:
pearl.302> cat file3
<parent>
<aritifactID> </artifactID>
<groupID> </groupID>
<version>2.0.0</version>
</parent>
<properties>
<version>2.0.0</version>
</properties>
<dependencies>
<dependency>
<version>2.0.0</version>
</dependency>
</dependencies>
pearl.303> nawk '{a=$0;
getline;
if($0!~/depend/ && a!~/version/)
{gsub(/2.0.0/,"1.0.0",$0);print a"\n"$0}
else print a"\n"$0 }' file3
<parent>
<aritifactID> </artifactID>
<groupID> </groupID>
<version>1.0.0</version>
</parent>
<properties>
<version>1.0.0</version>
</properties>
<dependencies>
<dependency>
<version>2.0.0</version>
</dependency>
</dependencies>
答案 3 :(得分:0)
awk -v change=1 -v newver=2.3.4 '
change && /version/ {sub(/>[^<]+/, ">" newver)}
/<\/?dependencies>/ {change = !change}
{print}
'