Найти и заменить в yml файле

У меня есть следующий файл yml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: queue
spec:
  selector:
    matchLabels:
      app: queue
  replicas: 1
  template: # template for the pods
    metadata:
      labels:
        app: queue
    spec:
      containers:
      - name: 
        image: 
        resources:
          requests:
            memory: 300Mi

Мне нужно указать имя и изображение в разделе "Развертывание": Метаданные развертывания: имя: очередь

Мне нужно ввести следующую строку в этот файл для развертывания под

 spec:
      containers:

раздел.

go:dev
go:latest

Желаемый результат

apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: queue
    spec:
      selector:
        matchLabels:
          app: queue
      replicas: 1
      template: # template for the pods
        metadata:
          labels:
            app: queue
        spec:
          containers:
          - name: go:dev
            image: go:latest
            resources:
              requests:
                memory: 300Mi

Можно ли выполнить вышеуказанное с помощью сценария оболочки, используя какое-либо регулярное выражение или подобное?

1 ответ

@RavinderSingh13 прав в том, что не использует awk, sedили некоторые другие строковые утилиты для этого. Использование - правильный способ сделать это.

https://github.com/mikefarah/yq

https://mikefarah.gitbook.io/yq/

я использовал yq version 4.6.3.

Чтобы обновить каждое свойство по отдельности, выполните следующие команды. В -i изменить файл на месте.

      yq -i eval '.spec.template.spec.containers[0].name = "go:dev"' file.yml
yq -i eval '.spec.template.spec.containers[0].image = "go:latest"' file.yml

yqрезультаты запроса также могут передаваться друг в друга. Это может быть использовано здесь для обновления обоих полей в одной команде.

      yq -i eval '.spec.template.spec.containers[0].name = "go:dev" | 
            .spec.template.spec.containers[0].image = "go:latest"' file.yml
Другие вопросы по тегам