在文本文件的字符串中增加零填充数字

时间:2014-11-03 12:43:38

标签: bash awk versioning increment gawk

我的项目有文件web / .htaccess

在某处,每个都有一行像

  

SetEnv BUILD_ID 1443.303.0001016

我通常使用以下命令更新这些数字字段(在cron脚本中)

grep "^SetEnv BUILD_ID " .htaccess && sed -i.bak -r 's/^(SetEnv BUILD_ID )([0-9]+)\.([0-9]+)\.(0*)([0-9]+)(.*)/printf "\1"$(date +%y%U.%j.)"%05d"$((\5+1))\6/ge' .htaccess 

如您所见,前两个仅来自时间戳: yyWeekOfYear.DayOfYear.0001016

问 上面的 sed 正确设置了字段1和2,但字段3填充了五个零,如下所示:

  

SetEnv BUILD_ID 1444.307.000001017

如何使用现代 awk / gawk增加此字段3并在文件中就地更新整行,这样字段3将具有正好7位数,用零填充?假设我的项目都不会有超过10 ^ 7的次要版本号。

或者这可以仅使用日期 bash 来完成?

部分类似于Perl / Awk / Sed - Find and Replace Number & auto-incrementAdd leading zeroes to awk variable

1 个答案:

答案 0 :(得分:2)

这应该做你想要的,全部用awk:

awk '/SetEnv BUILD_ID/{split($3,a,".")
              $3=sprintf("%s.%07d",strftime("%y%U.%j",systime()),+a[3]+1)}
     1' .htaccess >tmp && mv tmp .htaccess

一衬垫:

awk '/SetEnv BUILD_ID/{split($3,a,".");$3=sprintf("%s.%07d",strftime("%y%U.%j",systime()),+a[3]+1)}1' .htaccess >tmp && mv tmp .htaccess
  • 它按.
  • 拆分字段3
  • 然后将字段3设置为格式化日期,将分割命令中的第3个字段设置为
  • 1打印所有行。
  • 将此内容写入tmp文件。
  • 如果成功,则用tmp覆盖当前文件。