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

标签 linux perl bash maven sed

我正在寻找一个 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 脚本,它可以

  1. 用实际版本号替换@@VERSION@@
  2. 删除当前版本行
  3. 在 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/

相关文章:

linux - 如何设置 linux 内核不发送 RST_ACK,这样我就可以在原始套接字中提供 SYN_ACK

c++ - Linux QT 创建者 C++ : How to link with $$HOME?

perl - Data::Dumper 包装第二个单词的输出

perl - 如何在 perl 中执行多行 shell 命令?

bash - 实时读取两个文件

bash - 查找文件名以指定字符串开头的所有文件?

linux - 使用 bash shell 脚本比较不同目录中的文件

linux - 我可以使用 malloc 在 mmap 文件上分配内存吗

Perl 意想不到的结果

linux - BASH/sed - 不为简单的 sed 命令提供相同的输出