Bash 文本文件中字符串内的递增零填充数

Bash 文本文件中字符串内的递增零填充数,bash,awk,versioning,increment,gawk,Bash,Awk,Versioning,Increment,Gawk,我的项目有web/.htaccess文件 在里面的某个地方,每个都有一条像 SetEnv内部版本号1443.303.0001016 我通常使用以下命令更新这些数字字段(在cron脚本中): 如您所见,前两个仅来自时间戳:yyWeekOfYear.DayOfYear.0001016 问题: 上面的sed正确地设置了字段1和2,但是字段3用五个零填充,如下所示: SetEnv构建_ID 1444.307.00001017 如何仅使用modernawk/gawk增加此字段3并更新文件中的整行,以便字段

我的项目有web/.htaccess文件

在里面的某个地方,每个都有一条像

SetEnv内部版本号1443.303.0001016

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

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

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

SetEnv构建_ID 1444.307.00001017

如何仅使用modernawk/gawk增加此字段3并更新文件中的整行,以便字段3正好有7位数字,并用零填充?假设我的项目中没有一个次要版本号超过10^7

或者,可以只使用日期bash

部分类似于和

这应该可以满足您的需要,一切都在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设置为格式化日期,并将split命令中的第3个字段设置为格式化日期
  • 1
    打印所有行
  • 将其写入tmp文件
  • 若成功,则用tmp覆盖当前文件

所以您只想将该行替换为与最后一个点后的位完全相同但为+1的行?如何更新一年中的星期和一天?awk无法进行内联替换,也不清楚为什么
yyWeekOfYear.DayOfYear
无法更新incremented@anubhava最新的Gawk有内联功能是的,我读过,但很少有系统有内联功能。@Jidder字段1和2不会自动递增。只需通过
date
重新评估,或者希望在
bash
awk
中已经内置了一些环境变量,以保持代码简短。(该部分已在
sed
版本中工作)谢谢。除了最后一部分;我希望在上面的
sed
中找到一些类似
-I.bak
的内联文件编辑。Linux(Ubuntu14.04)中的
awk
手册页没有什么特别之处。这将避免shell与我先前存在的
grep…&&&过滤器,这对我很重要。使用awk新的就地编辑,我的最终版本是
tty-s&&grep“^SetEnv BUILD_ID”web/.htaccess&&awk-i inplace-v inplace_后缀=.bak'/SetEnv/{split($3,a,“.”;$3=sprintf(%s.%07d),strftime(%y%U.%j),systime(),+a[3]+1])1'web/.htaccess
tty-s
仅当脚本以交互方式运行时才进行更新,而不是从crontab运行。@Marcos为什么要进行grepping?awk会帮你处理的,如果它没有找到那条线,什么都不会改变。我还遗漏了-i,因为这是一项非常新的功能,大多数人不会使用它。grep阻止sed触摸文件(时间戳),即使没有找到匹配的行。我不知道新的awk在这种情况下是如何工作的(保留不匹配的文件时间戳)。我们的.htaccess文件可能有许多SetEnv行用于Apache Web服务器变量,而不是BUILD_ID。因此,您的
/SetEnv/
行的早期可能需要更加具体,以避免损坏不相关的行,即:
/SetEnv BUILD_ID/
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