我在 Linux 上有一个文本文件,我想使用 awk 更改日期部分并放入当前日期。当然,我写了这个并且它有效,但是我必须手动给它日期,我想要的是它自动替换当天的日期。
代码 :
awk '{gsub(/ISODate\(\"[0-9][0-9][0-9][0-9][-][0-9][0-9][-][0-9][0-9]/,"ISODate(\"2022-10-02");print}' rasoul-02.json
答案1
有多种方法可以获取今天日期的 ISO 格式。
- 使用外部命令:
date +'%F'
- 使用 shell 命令:
printf '%(%F)T\n' -1
- 在某些 awk 版本中:
strftime("%F")
最通用(便携式)的解决方案是使用date
:
awk '{gsub(/ISODate\([0-9]{4}([-][0-9]{2}){2}\)/,"ISODate("isodate")")}1
' isodate=$(date +'%F') rasoul-02.json
使用 shell 内部日期格式的可能解决方案是:
$ printf -v isodate '%(%F)T' '-1';
$ awk '{gsub(/ISODate[(]["][0-9]{4}([-][0-9]{2}){2}["][)]/,"ISODate(===\""isodate"\")")}1
' isodate=$isodate rasoul-02.json
并使用strftime
GNU awk 的功能(和其他一些):
awk '{ gsub( /ISODate[(]["][0-9]{4}([-][0-9]{2}){2}["][)]/ , "ISODate(\"" strftime("%F") "\")" )}1
' rasoul-02.json
答案2
您可以将日期awk
作为变量传递:
awk -v date="$(date +%F)" '{gsub(/ISODate\("[0-9][0-9][0-9][0-9][-][0-9][0-9][-][0-9][0-9]/,"ISODate(\""date"\"");print}'
如果您可以使用 GNU awk ( gawk
),您还可以显着简化您的正则表达式:
gawk -v date="$(date +%F)" '{
gsub(/ISODate\("[0-9]{4}-[0-9]{2}-[0-9]{2}/,"ISODate(\""date);
print
}' rasoul-02.json
然而,这都是一个非常糟糕的主意。如果您正在使用 JSON 文件,那么有类似的专用 JSON 解析器jq
可以以更安全、更简单的方式完成此操作。我强烈建议您发布实际文件,以便我们提供更好的答案。