0

我的项目中有一些 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 脚本。

谢谢

4

4 回答 4

2

你可以试试:

sed -e '/<dependencies>/,/<\/dependencies>/ !{ 
       s!<version>[0-9.]\+</version>!<version>'"$NEWVERSION"'</version>!
       }' MY_FILE

说“找到和之间的/<dependencies>/,/<\/dependencies>/所有线”。<dependencies></dependencies>

后面的!内容是“在那些行之外的所有地方执行以下操作(即对between<dependencies>和之外的所有行执行此操作</dependencies>)”。

上面写着“s!<version>[0-9.]\+</version>!<version>'"$NEWVERSION"'</version>!替换<version>...</version><version>$NEWVERSION</version>,其中$NEWVERSION是一些包含新版本号的环境变量。

用引号 ( '"$NEWVERSION"') 放屁是因为我想要 sed 命令的主要部分使用单引号(所以我不必担心感叹号和反斜杠),但我确实想要$NEWVERSION扩展。

修改以适合您的脚本。

于 2012-04-03T23:58:53.883 回答
1

要解析和修改 XML - 您确实应该使用可识别 xml 的解析器,例如lxml而不是文本工具,例如sedawk

我假设您的 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>
于 2012-04-04T07:23:20.020 回答
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>
于 2012-04-04T07:09:46.143 回答
0
awk -v change=1 -v newver=2.3.4 '
  change && /version/ {sub(/>[^<]+/, ">" newver)} 
  /<\/?dependencies>/ {change = !change} 
  {print}
'
于 2012-04-04T13:12:29.920 回答