如果多个文件中的数字不总是相同的,如何递增这些数字?

4

我有几个文件包含这一行

Release: X

我希望在所有文件中增加X的值。

如果文件之间X是恒定的,我可以编写一个Bash脚本循环遍历这些文件并执行以下操作(其中$1包含先前版本号,$2为新版本号,即$1+1):

sed 's/Release: '$1'/Release: '$2'/' <$file >$file.new

如果文件之间的发布版本号不同,我该怎么办?

可以使用sed吗?

还是应该使用其他工具?

2个回答

13

使用awk - 它是处理这种情况的恰当工具:

awk '/Release: [0-9]+/ { printf "Release: %d\n", $2+1 }' < $file > $file.new

翻译:

  • 搜索包含“Release:”后跟一个或多个数字的行。
  • 打印“Release:”后跟一个数字和换行符。该数字是输入行中的第二个单词(即数字)加1。

非常感谢,这正是我在寻找的。我现在会寻找有关awk的教程并学习更多相关知识。 - Barth
您还需要确保将一个文件定义为版本的主要“源”。因此,所有其他文件都应从该单一源获取其版本。 - Aaron Digulla
1
使用 {print $0} 打印除了“Release line”之外的那些行应该很简单。请参考手册以获取确切的语法。 - Vijay Dev
1
记录一下,我最终得到了以下代码,但我相信还有更好的方法: awk '/Release: /{printf "Release: %d\n", $2+1};!/Release: /{print}' < $file > $file.new - Barth
1
你的最终结果仍会丢弃版本号后面的内容(例如,“Release 2: These are not the droids you're looking for”将变成“Release 3”)。当然,这可能不是你的情况。 - The Archetypal Paul
显示剩余2条评论

8
这个perl one-liner可以像awk脚本一样执行相同的操作,但不会破坏文件的其余部分或包含发布的其余行。
 perl -pe "$_=~s/Release: (\d+)/'Release: '. ($1+1)/e;" < file > file.new

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接