【问题标题】:Replace value containing quotes with sed command and regex用 sed 命令和正则表达式替换包含引号的值
【发布时间】:2020-07-12 14:22:54
【问题描述】:

我正在尝试使用 sed 在我的 yaml 文件中替换一个新版本,但我无法弄清楚该语句中缺少什么。

我要转换

version: "x.x.x"

version: "z.z.z"

这是我目前的 sed 声明:

sed -i "" "s|version: "[[:digit:]].[[:digit:]].[[:digit:]]"\|version: "${VERSION}"|" file.yaml

【问题讨论】:

  • 试试:sed "s~version: \"[[:digit:]]\.[[:digit:]]\.[[:digit:]]\"~version: \"$VERSION"~"
  • 对于实际使用,我会为此使用 yq(或使用几个可用 YAML 库之一的 Python 脚本)而不是 sed。 YAML 可以用许多语法不同的方式编写,但语义相同; sed 只能处理一个公式,而 YAML 感知工具可以正确读取和修改 任何 等效文档。

标签: regex bash sed replace


【解决方案1】:

你可以使用

sed -i "" 's|version: "[[:digit:]]\.[[:digit:]]\.[[:digit:]]"|version: "'"${VERSION}"'"|' file.yaml

要匹配一个或多个数字,您可以在 eacg [[:digit:]] 之后使用 \{1,\} 范围限定符:

sed -i "" 's|version: "[[:digit:]]\{1,\}\.[[:digit:]]\{1,\}\.[[:digit:]]\{1,\}"|version: "'"${VERSION}"'"|' file.yaml

详情

  • version: "[[:digit:]]\.[[:digit:]]\.[[:digit:]]" - LHS,匹配 version:、空格、"、一个数字、.、一个数字、. 和一个数字(如果使用 \{1,\},则为数字)
  • version: "'"${VERSION}"'" - RHS,替换,替换为 version:、空格、"VERSION 变量内容和 "

您可以通过使用稍微缩短命令

sed -i "" 's|\(version: "\)[[:digit:]]\(\.[[:digit:]]\)\{2\}"|\1'"${VERSION}"'"|' file.yaml

\(version: "\) 被捕获到第 1 组中,在 RHS 内部,\1 用于将其插入回去,. 和 digit 的重复由另一个用\{2\}(两次)量词量化的组完成.

【讨论】:

    【解决方案2】:
    sed -i -r "s@version: [0-9]+\.[0-9]+\.[0-9]+@version: ${VERSION}@" file.yaml
    

    【讨论】:

    • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案以添加解释并说明适用的限制和假设。 From Review
    【解决方案3】:
    $ sed 's/\(version: "\)[^"]*/\1'"$VERSION"'/' file
    version: "z.z.z"
    

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 2020-08-09
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2018-08-22
      相关资源
      最近更新 更多