将 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:-]*
- 匹配零个或多个数字,T
、Z
、:
或 -
字符
(")
- 捕获匹配 "
char 的第 2 组
"`$(date -uformat +"%Y-%m-%dT%H:%M:%SZ")`"
是表示双引号字符串文字的替换(因此允许字符串插值),它将用 -replace
找到的每个匹配项替换为第 1 组值(请参阅 "`"
对第 1 组的数字反向引用,$
之前的反引号告诉 Powershell 这不是插值变量,大括号是必需的,因为下一个字符将是数字字符)+ 日期(它需要 $(...)
语法) 然后是第 2 组值(如果您不想在模式中引入另一个捕获组,则可以只使用 `"
)。
我一直在用头撞墙,但实际上我有一个 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:-]*
- 匹配零个或多个数字,T
、Z
、:
或-
字符(")
- 捕获匹配"
char 的第 2 组
"`$(date -uformat +"%Y-%m-%dT%H:%M:%SZ")`"
是表示双引号字符串文字的替换(因此允许字符串插值),它将用-replace
找到的每个匹配项替换为第 1 组值(请参阅"`"
对第 1 组的数字反向引用,$
之前的反引号告诉 Powershell 这不是插值变量,大括号是必需的,因为下一个字符将是数字字符)+ 日期(它需要$(...)
语法) 然后是第 2 组值(如果您不想在模式中引入另一个捕获组,则可以只使用`"
)。