AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79425774
Accepted
Inx51
Inx51
Asked: 2025-02-10 06:21:43 +0800 CST2025-02-10 06:21:43 +0800 CST 2025-02-10 06:21:43 +0800 CST

如何使用 Nushell 通过具有给定值的特定属性进行过滤来更新数组中项目的值?

  • 772

我有以下 YAML(Kubernetes 部署):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
      - name: myapp
        image: some-app:latest
        ports:
        - containerPort: 80

仅使用 Nushell,我想更新名为的image容器的值。"myapp""some-app:1.0.0"

有什么想法可以做到这一点吗?

我完全知道我可以使用多种其他工具,例如kubectland/oryq等。——这更像是一个如何使用 Nushell 过滤和设置数组中的值的一般问题,而不是解决上述实际问题。上述示例主要是为了提供一些“具体”的东西作为示例。

我尝试过一些解决方案,但都没有真正起作用。我的目标是不必编写非常复杂的脚本来实现这一点,因为感觉我错过了一些东西。

例如,我尝试过以下方法:

open ./deployment.yaml | get spec.template.spec.containers | where name == "myapp" | update image "some-app:1.0.0" | collect | save ./deployment.yaml -f

但这会将文件的全部内容替换为:

- name: myapp
  image: some-app:1.0.0
  ports:
  - containerPort: 80
yaml
  • 2 2 个回答
  • 46 Views

2 个回答

  • Voted
  1. Best Answer
    pmf
    2025-02-10T08:01:58+08:002025-02-10T08:01:58+08:00

    这里有一种方法:通过迭代其项目来找到update下面的表格,其中只有字段的值符合您的条件:spec.template.spec.containerseachupdateimageifname

    open … | update spec.template.spec.containers {
      each {if $in.name == "myapp" {update image "some-app:1.0.0"} else {}}
    } | save …
    
    • 2
  2. NotTheDr01ds
    2025-02-11T01:33:12+08:002025-02-11T01:33:12+08:00

    我已经多次遇到过这种情况,无论是个人还是在 Nushell Discord 中,我只是不相信现在有一种简单的内置方法可以根据该行中的值更新表行。如果我们“逻辑地”构造数据,我们可能会使用记录spec.template.spec.containers而不是表,但在处理外部数据时我们通常别无选择。

    我之前写过一个自定义命令,可能会简化这里的事情 - 它实际上只是@pmf 答案的更“通用”形式。它允许您更新给定的表行:

    • 要更新的列名称
    • 定义触发行条件的闭包
    • 带有新值的闭包(可以动态计算)

    作为奖励,它可以在更大的表上并行运行。

    我可能需要看看是否可以将其包含在 Nushell 标准库中以方便使用:

    def if-update [
      field: cell-path,
      --where (-w): closure,
      --to (-t): closure
      --parallel (-p)
    ]: list -> list {
      if $parallel {
        par-each {update $field {|row| if ($row | do $where $row) { do $to $row} else {}}}
      } else {
        each {update $field {|row| if ($row | do $where $row) { do $to $row} else {}}}
      }
    }
    

    要使用它来更新您的用例:

    open deployment.yaml
    | # Update the table itself
    | update spec.template.spec.containers {
        # Conditionally update "image" for "myapp"
        if-update image --where {|container| $container.name == myapp} --to { 'some-app:1.0.0' }
      }
    | save -f deployment.yaml
    

    免责声明:我目前是 Nushell 维护者之一。

    • 1

相关问题

  • 如果地图来自环境变量,yq 无法正确解释地图列表中的地图

  • yaml 文件-大写参数

  • 使用 R Markdown 创建网站时,如何在 _site.yml 文件中将导航栏中的文本拆分为两行

  • 从 YAML 创建 Conda 环境时出现 PackagesNotFoundError

  • 如何使用 yq 在 YAML 中添加具有地图的列表

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve