如何使用sed替换引号中的字符串

如何使用sed替换引号中的字符串

我想使用 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

  1. 格式化日期末尾Z的 表示时区是 UTC,又名 +0000,因此您应该使用date --utc,而不仅仅是date

    看起来这个文件的任何内容都需要X-Apple-I-Client-Time采用 UTC 格式,而实际时区则采用X-Apple-I-TimeZone.

  2. 为什么使用$time0$time1何时date可以只用一个格式字符串生成完整的时间(例如+%FT%TZ。我不记得%F和%T是否是GNU扩展date,所以你可能不得不使用'+%Y-%m-%dT%H:%M:%SZ')。

  3. 如果您需要$time0$time1在单独的变量中,那么使用命令替换和 echo 将它们组合起来$time不仅是不必要的,而且可能是最糟糕的方法。使用类似这样的东西:

    time="${time0}T${time1}Z"
    
  4. 要将时间戳插入文件中,您可以执行以下操作:

    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
    
  5. 就我个人而言,我会避免使用名为的变量,$time因为它与内置time命令和相同/usr/bin/time。不小心=在赋值前添加了一个空格(例如time = "${time0}T${time1}Z" instead oftime="${time0}T${time1}Z" ) will run thetime` 命令。

    $t如果它是一次性变量,或者更具描述性且更长一点的变量,我可能会使用它。

相关内容