我正在寻找一个 bash 脚本,用于比通常通过 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 脚本,它可以
- 用实际版本号替换@@VERSION@@
- 删除当前版本行
- 在 TEMPLATE:END 之前的行中写入更新的版本行(同时在文件中保留 @@VERSION@@ - 可能通过将模板写入临时文件,进行替换,然后再返回来做到这一点?)
我可以排序使用 ant 脚本做一些这样的事情(写入新文件,进行替换)
<replace file="pom.xml"><br/>
<replacefilter
token="@@VERSION@@"
value="${version}"/><br/>
</replace>
但我不确定 a.) 删除旧版本行或 b.) 告诉它在正确位置复制新行的最佳方法是什么。任何人都知道如何执行此操作或有任何建议?
最佳答案
假设新版本号在 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
没有变化。
关于linux - Bash脚本从一行复制并用副本替换另一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10761535/