首页 > 解决方案 > awk 在第 n 次出现后插入缩进

问题描述

我正在尝试编辑缩进至关重要的 yaml 文件。下面是输入

spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app.kubernetes.io/name: myapp
      app.kubernetes.io/instance: myapp
  template:
    metadata:
      annotations:
        checksum/config: 2cee4a874d2afd91d92301f15efece5afbca3abc63ba3b2b
        checksum/tls-secrets: 649c0580ebbcf3ae194d17b8ac4cc2f1cda33f145da9764
      labels:
        app.kubernetes.io/name: myapp
        app.kubernetes.io/instance: myapp
    spec:
      serviceAccountName: myapp-acc
      containers:
        - name: myapp-pod
          image: "imagerepo"
          resources:
            requests:
              cpu: 500m
              memory: 800Mi

我想在 yaml 文件中第 11 次出现的“resources:”和文件中第 1 次出现的“serviceAccountName:”之后插入带有缩进的相应数据。我的意思是无论缩进搜索模式有什么我们可以相应地调整插入文本的缩进资源之后:我想要

    limits:
      cpu: 500m
      memory: 800Mi

服务后AccountName

  imagePullSecrets:
    - name: imagepullsecret

输出文件

spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app.kubernetes.io/name: myapp
      app.kubernetes.io/instance: myapp
  template:
    metadata:
      annotations:
        checksum/config: 2cee4a874d2afd91d92301f15efece5afbca3abc63ba3b2b
        checksum/tls-secrets: 649c0580ebbcf3ae194d17b8ac4cc2f1cda33f145da9764
      labels:
        app.kubernetes.io/name: myapp
        app.kubernetes.io/instance: myapp
    spec:
      serviceAccountName: myapp-acc
      imagePullSecrets:
        - name: imagepullsecret
      containers:
        - name: myapp-pod
          image: "imagerepo"
          resources:
            limits:
              cpu: 500m
              memory: 800Mi
            requests:
              cpu: 500m
              memory: 800Mi

标签: awkyamlindentation

解决方案


$ cat tst.awk
{ print }
sub(/serviceAccountName:.*/,"") && (++cnt1 == 1) {
    print $0 "imagePullSecrets:"
    print $0 "  - name: imagepullsecret"
}
sub(/resources:.*/,"") && (++cnt2 == 11) {
    print $0 "  limits:"
    print $0 "    cpu: 500m"
    print $0 "    memory: 800Mi"
}

$ awk -f tst.awk file
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app.kubernetes.io/name: myapp
      app.kubernetes.io/instance: myapp
  template:
    metadata:
      annotations:
        checksum/config: 2cee4a874d2afd91d92301f15efece5afbca3abc63ba3b2b
        checksum/tls-secrets: 649c0580ebbcf3ae194d17b8ac4cc2f1cda33f145da9764
      labels:
        app.kubernetes.io/name: myapp
        app.kubernetes.io/instance: myapp
    spec:
      serviceAccountName: myapp-acc
      imagePullSecrets:
        - name: imagepullsecret
      containers:
        - name: myapp-pod
          image: "imagerepo"
          resources:
            limits:
              cpu: 500m
              memory: 800Mi
            requests:
              cpu: 500m
              memory: 800Mi

我最初在提供示例输入上运行代码后添加了++cnt测试,因为该输入不提供测试该功能的方法。


推荐阅读