将 SED 转换为包含正则表达式和日期的替换

Converting SED to Replace containing Regex and Dates

我一直在用头撞墙,但实际上我有一个 curl 命令,它包含一个 replace (sed) 命令,我想将它转换为相当于使用 replace 的 powershell,我觉得我的quotes/escaping 文本的顺序不太正确。

我的输出是这样的:"cattle.io/timestamp":"2022-02-22T11:11:00Z"

我唯一想更改的部分是 date/time 戳记,以便它更新到当前日期时间。

以下在 curl 中有效:sed "s/\"cattle\.io\/timestamp\"\:\"[0-9T:Z-]*\"/\"cattle\.io\/timestamp\":\"(date -u +"%Y-%m-%dT%H:%M:%SZ")"/g"

我认为它会是这样的:replace '"cattle.io/timestamp":"[0-9T:Z-]*"','"cattle.io/timestamp":"(date -uformat +"%Y-%m-%dT%H:%M:%SZ")' 使用单引号来转义但显然不是。

你可以使用

$s = '"cattle.io/timestamp":"2022-02-22T11:11:00Z"'
$s -replace '("cattle\.io/timestamp":")[\dTZ:-]*(")',"`$(date -uformat +"%Y-%m-%dT%H:%M:%SZ")`"

在您的代码中:

$command = (curl --silent -H "Authorization: Bearer token-xxx" --url 'link.com' -X GET  -H 'Content-Type: application/json' -H 'Cache-Control: no-cache' --insecure 2>&1) -replace '("cattle\.io/timestamp":")[\dTZ:-]*(")',"`$(date -uformat +"%Y-%m-%dT%H:%M:%SZ")`"

输出:

"cattle.io/timestamp":"2022-02-23T11:07:56Z"

详情:

  • -replace 是在 Powershell 中支持基于正则表达式的搜索和替换的运算符
  • ("cattle\.io/timestamp":") - 捕获匹配文字 "cattle.io/timestamp":" 文本的组 1 (</code>)(注意文字点需要在正则表达式中转义)</li> <li><code>[\dTZ:-]* - 匹配零个或多个数字,TZ:- 字符
  • (") - 捕获匹配 " char
  • 的第 2 组
  • "`$(date -uformat +"%Y-%m-%dT%H:%M:%SZ")`" 是表示双引号字符串文字的替换(因此允许字符串插值),它将用 -replace 找到的每个匹配项替换为第 1 组值(请参阅 "`" 对第 1 组的数字反向引用,$ 之前的反引号告诉 Powershell 这不是插值变量,大括号是必需的,因为下一个字符将是数字字符)+ 日期(它需要 $(...) 语法) 然后是第 2 组值(如果您不想在模式中引入另一个捕获组,则可以只使用 `")。