【问题标题】:yq replace a value with another value of a mapyq 用地图的另一个值替换一个值
【发布时间】:2023-01-07 00:51:03
【问题描述】:
  myFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: myFunction
      Handler: myFunction.lambda_handler

  myOtherFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: myOtherFunction
      Handler: myOtherFunction.lambda_handler

我想运行一个 yq 命令,这样对于每个 Type:AWS::Serverless::Function 资源,我想获取 Handler 的值并在名为 Environment.Variables.HANDLER 的属性下创建另一个属性。

到目前为止,我有以下命令。
yq '(.Resources.[] | select(.Type=="AWS::Serverless::Function") | .Properties.Environment.Variables.HANDLER) += (.Resources.[].Properties.Handler)' test.yaml

结果是

  myFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: myFunction
      Handler: myFunction.lambda_handler
      Environment:
      Variables:
        HANDLER: myOtherFunction.lambda_handler # This is wrong

  myOtherFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: myOtherFunction
      Handler: myOtherFunction.lambda_handler
      Environment:
        Variables:
          HANDLER: myOtherFunction.lambda_handler

Environment.Variables.HANDLER 替换为 myOtherFunction 的所有功能的处理程序。我如何分别从要替换的特定资源中获取价值?

【问题讨论】:

    标签: yaml yq


    【解决方案1】:

    每当您想留在上下文中时,请使用更新运算符|=

    .Resources[]
      |= select(.Type=="AWS::Serverless::Function").Properties
        |= .Environment.Variables.HANDLER = .Handler
    

    或者使用 with 函数:

    with(
      .Resources[] | select(.Type=="AWS::Serverless::Function").Properties;
      .Environment.Variables.HANDLER = .Handler
    )
    

    两者都评估为:

    Resources:
      myFunction:
        Type: AWS::Serverless::Function
        Properties:
          FunctionName: myFunction
          Handler: myFunction.lambda_handler
          Environment:
            Variables:
              HANDLER: myFunction.lambda_handler
      myOtherFunction:
        Type: AWS::Serverless::Function
        Properties:
          FunctionName: myOtherFunction
          Handler: myOtherFunction.lambda_handler
          Environment:
            Variables:
              HANDLER: myOtherFunction.lambda_handler
    

    注意:在您的方法中,第二次使用 .Resources.[] 再次开始迭代,因此所有匹配项都收到了最后获取的值。

    【讨论】:

    • 大侠,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2021-09-28
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多