Bash 文本文件中字符串内的递增零填充数
我的项目有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 部分类似于和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并更新文件中的整行,以便字段
这应该可以满足您的需要,一切都在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覆盖当前文件
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