我想使用 sed 替换下面代码中的当前时间
time0=$(date '+%Y-%m-%d')
time1=$(date '+%H:%M:%S')
time=$(echo ""$time0"T"$time1"Z")
替换第一行的 $time
{
"X-Apple-I-Client-Time" = "2020-07-08T12:55:08Z";
"X-Apple-I-Locale" = "en_US";
"X-Apple-I-MD" = "AAAABQAAABDBy+H0j9QAnYGIzrmKeh9DAAAAAw==";
"X-Apple-I-MD-M" = "6Q3cWbCm2lI9rrTIyrAsku5zxqO/ZAv9HsW5kHo2thiPqFINp0/OsOz++KS/2vc0ImbI2iMVUbYCZjnS";
"X-Apple-I-MD-RINFO" = 50660608;
"X-Apple-I-TimeZone" = "GMT+7";
}
谢谢全部
答案1
now=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
sed 's/\("X-Apple-I-Client-Time" = \).*/\1"'"$now"'";/' file
这将计算当前 UTC 时间戳并将其保存在 shell 变量中now
。然后,它会在名为的文件中找到file
包含确切字符串的任何行"X-Apple-I-Client-Time" =
,并将其后的所有内容替换为引号中的时间戳和尾随;
.
结果写入标准输出。如果您想直接在原始文件中进行更改,您可能需要使用
now=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
cp file file.tmp &&
sed 's/\("X-Apple-I-Client-Time" = \).*/\1"'"$now"'";/' file.tmp >file &&
rm -f file.tmp
(这会破坏file.tmp
)
如果您的系统的sed
实现具有-i
“就地”编辑功能,那么您显然可以使用它。并不是说sed -i
在 FreeBSD 和 macOS 上需要一个空参数来选择在-i
没有备份文件的情况下进行编辑(请参阅如何使用 sed -i (就地编辑)实现可移植性?)。
答案2
格式化日期末尾
Z
的 表示时区是 UTC,又名 +0000,因此您应该使用date --utc
,而不仅仅是date
。看起来这个文件的任何内容都需要
X-Apple-I-Client-Time
采用 UTC 格式,而实际时区则采用X-Apple-I-TimeZone
.为什么使用
$time0
和$time1
何时date
可以只用一个格式字符串生成完整的时间(例如+%FT%TZ
。我不记得%F和%T是否是GNU扩展date
,所以你可能不得不使用'+%Y-%m-%dT%H:%M:%SZ'
)。如果您需要
$time0
和$time1
在单独的变量中,那么使用命令替换和 echo 将它们组合起来$time
不仅是不必要的,而且可能是最糟糕的方法。使用类似这样的东西:time="${time0}T${time1}Z"
要将时间戳插入文件中,您可以执行以下操作:
time=$(date --utc +%FT%TZ) # or maybe use '+%Y-%m-%dT%H:%M:%SZ' instead sed -i -e '/X-Apple-I-Client-Time/s/ = "[^"]*"/ = "'"$time"'"/' filename.txt
或者(如果您需要
$time0
并且$time1
在脚本的其他地方):time0=$(date --utc '+%Y-%m-%d') time1=$(date --utc '+%H:%M:%S') time="${time0}T${time1}Z" sed -i -e '/X-Apple-I-Client-Time/s/ = "[^"]*"/ = "'"$time"'"/' filename.txt
就我个人而言,我会避免使用名为的变量,
$time
因为它与内置time
命令和相同/usr/bin/time
。不小心=
在赋值前添加了一个空格(例如time = "${time0}T${time1}Z" instead of
time="${time0}T${time1}Z") will run the
time` 命令。$t
如果它是一次性变量,或者更具描述性且更长一点的变量,我可能会使用它。