我正在寻找一个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脚本我可以排序使用蚂蚁脚本来完成其中一些操作(写入新文件,进行替换)
<replace file="pom.xml">
<replacefilter
token="@@VERSION@@"
value="${version}"/>
</replace>
但我不知道最好的方法是什么。)删除旧版本的行或b。)告诉它在正确的地方复制新行。有人知道怎么做或有任何建议吗?
答案 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;