查找并替换特定块中的版本

时间:2012-04-03 23:29:10

标签: python sed

我的项目中有一些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 个答案:

答案 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而不是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>

答案 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}
'