首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过sed更新K8s清单文件

无法通过sed更新K8s清单文件
EN

Stack Overflow用户
提问于 2021-02-08 11:26:27
回答 1查看 68关注 0票数 0

我有如下的YAML文件:

代码语言:javascript
复制
apiVersion: v1
items:
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    creationTimestamp: 2019-03-20T23:17:42Z
    name: default
    namespace: dev4
    resourceVersion: "80999"
    selfLink: /api/v1/namespaces/dev4/serviceaccounts/default
    uid: 5c6e0d09-4b66-11e9-b4e3-0a779a87bb40
  secrets:
  - name: default-token-tl4dd
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"pod-labeler","namespace":"dev4"}}
    creationTimestamp: 2020-04-21T05:46:25Z
    name: pod-labeler
    namespace: dev4
    resourceVersion: "113455688"
    selfLink: /api/v1/namespaces/dev4/serviceaccounts/pod-labeler
    uid: 702dadda-8393-11ea-abd9-0a768ca51346
  secrets:
  - name: pod-labeler-token-6vgp7
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

我正在使用sed更新要应用于集群的文件,我的sed命令如下:

代码语言:javascript
复制
sed -i \'/uid: \\|selfLink: \\|resourceVersion: \\|creationTimestamp: /d\' test1-serviceaccounts.yaml

但是,我得到的YAML文件如下所示:

代码语言:javascript
复制
apiVersion: v1
items:
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    name: default
    namespace: dev4
  secrets:
  - name: default-token-tl4dd
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"pod-labeler","namespace":"dev4"}}
    name: pod-labeler
    namespace: dev4
  secrets:
  - name: pod-labeler-token-6vgp7
kind: List
metadata:

我应该如何修改我的sed表达式来去掉最后一行metadata:

注意:它应该删除最后一行。

我确实尝试了下面的sed命令,但它产生了一个错误:

已更新sed命令:

代码语言:javascript
复制
sed -i '/uid: \|selfLink: \|resourceVersion: \|creationTimestamp: /$ d' 128-res-test-black-dev4-serviceaccounts.yaml

执行上述命令时出错:

代码语言:javascript
复制
sed: -e expression #1, char 60: unknown command: `$'

目标文件应如下所示:

代码语言:javascript
复制
apiVersion: v1
items:
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    name: default
    namespace: dev4
  secrets:
  - name: default-token-tl4dd
- apiVersion: v1
  kind: ServiceAccount
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"pod-labeler","namespace":"dev4"}}
    name: pod-labeler
    namespace: dev4
  secrets:
  - name: pod-labeler-token-6vgp7
kind: List
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-08 20:30:46

您真的应该尝试使用专用的yaml解析器,例如yq,但如果出于任何原因无法使用此类工具,您可以使用以下sed语句删除最后一行:

代码语言:javascript
复制
sed -rni '$!p' 28-res-test-black-dev4-serviceaccounts.yaml

不要打印输出(!p)的最后一行,而打印其他所有内容。

然后可以将其与现有sed命令集成:

代码语言:javascript
复制
sed -i '/uid: \|selfLink: \|resourceVersion: \|creationTimestamp: /$ d' 128-res-test-black-dev4-serviceaccounts.yaml && sed -rni '$!p' 28-res-test-black-dev4-serviceaccounts.yaml
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66095560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档