Bash脚本从一行复制并用副本替换另一行

时间:2012-05-25 21:23:59

标签: linux perl bash maven sed

我正在寻找一个bash脚本,比起通常的find / replace通过sed稍微复杂一些。我有一本名为bash Cookbook的书,我一直试图从中收集一些灵感,但我没有走得太远。

基本上我正在尝试编写一个脚本来自动更新一堆maven pom.xml文件中的版本号。以下是我正在查看的常规设置:

<!-- TEMPLATE:BEGIN
    <version>@@VERSION@@</version>
-->
    <version>1.0.0</version>
<!-- TEMPLATE:END -->

运行脚本后(使用新版本号1.0.1)我希望该文件能够读取此内容:

<!-- TEMPLATE:BEGIN
    <version>@@VERSION@@</version>
-->
    <version>1.0.1</version>
<!-- TEMPLATE:END -->

所以这将在实际发布的pom文件中,1.0.0是当前版本(我试图用1.0.1或其他东西替换它)。显然,版本号将会发生变化,因此没有一种好的方法可以进行查找/替换(因为您要查找的内容是可变的)。我希望能够编写一个可以

的bash脚本
  1. 将@@ VERSION @@替换为实际版本号
  2. 删除当前版本行
  3. 在TEMPLATE:END之前的行上写入更新的版本行(同时保留文件中的@@ VERSION @@ - 可以通过将模板写入临时文件,进行替换,然后重新进入?)来执行此操作。 / LI>

    我可以排序使用蚂蚁脚本来完成其中一些操作(写入新文件,进行替换) <replace file="pom.xml">
    <replacefilter token="@@VERSION@@" value="${version}"/>
    </replace>

    但我不知道最好的方法是什么。)删除旧版本的行或b。)告诉它在正确的地方复制新行。有人知道怎么做或有任何建议吗?

3 个答案:

答案 0 :(得分:3)

假设新版本号在shell变量$VERSION中,那么您应该可以使用:

sed -e '/<!-- TEMPLATE:BEGIN/,/<!-- TEMPLATE:END -->/{
        s/<version>[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*<\/version>/<version>'$VERSION'<\/version>/
        }'

请注意,这会忽略带有@@VERSION@@的模板版本行,但只会匹配包含TEMPLATE:BEGIN和TEMPLATE:END的行之间出现的三部分版本号,而其他所有内容(包括其他行包含单独<version>...</version>元素。

您可以决定如何进行文件覆盖(可能您的sed版本来自GNU,它可以根据请求使用-i选项自动执行)等等。您也可以使用更强大的正则表达式符号,可以实现更紧凑的匹配。但是,这应该适用于sed的大多数版本而无需更改。

答案 1 :(得分:1)

您概述的步骤(1-3)读作,就好像您实际上并不关心根据评论中定义的模板化规则执行替换。

因此,这里有一些代码表现得如你概述的那样冗长:

#!/bin/bash

file=$1
newversion=$2

sed -i $file -e "s|<version>\([^@]*\)</version>|<version>$newversion</version>|"

运行它:

chmod +x yourscript.sh
./yourscript.sh filetoupdate.xml 1.0.1

答案 2 :(得分:0)

use 5.010;
use strictures;
use Perl::Version qw();
use XML::LibXML qw();

my $dom = XML::LibXML->load_xml(location => 'pox.xml');

for my $node ($dom->findnodes('//version')) {
    my $version = Perl::Version->new($node->textContent);
    $version->inc_subversion;
    $version->stringify;
    $node->removeChildNodes;
    $node->appendText($version);
};

say $dom->toString;