sed を使用して、動的複数行文字列を一致させて追加します。

sed を使用して、動的複数行文字列を一致させて追加します。

state: present次の例に示すように、一致しuse: package_managerた後に新しい行に追加したいAnsible yamlファイルがありますsed

# Example 1
- name: Package X Install
  package:
    name:
      - package_1
      - package_2
    state: present

# Example 2
- name: Package Y Install
  package:
    name: package_3
    state: present

# Example 3
- block:
  - name: Package Z Install
    package:
      name: package_4
      state: present

# etc. Further examples would be any combination, iteration of the above.

しかし、プレイブック全体には、先行スペースの量が異なる複数の項目があります。一致はstate項目のすぐ下になければならず、インデントの量は同じでなければなりません。 Ansible PlayBookにはさまざまな用途があるため、state使用している検索アンカーに問題があります。sedstate: present

私が得る最も遠いものは次のとおりです。

$ sed '/\s\{4,\}package:*\s\{6,\}state: present/a \s\{6,\}use: package_manager'

ご存知のように、まったく動作しません。迷子になりました。どんな助けでもいただければ幸いです!

答え1

一致する行の空白をキャプチャしてから、挿入時に置き換えることができると思います。

sed 's/^\( *\)state: present$/&\n\1use: package_manager/' ansible.yaml

出力:

# Example 1
- name: Package X Install
  package:
    name:
      - package_1
      - package_2
    state: present
    use: package_manager

# Example 2
- name: Package Y Install
  package:
    name: package_3
    state: present
    use: package_manager

# Example 3
- block:
  - name: Package Z Install
    package:
      name: package_4
      state: present
      use: package_manager

# etc. Further examples would be any combination, iteration of the above.

答え2

質問のデータに適切なYAMLパーサーを使用してください。

$ yq -y '(.. | .package? | select(.state == "present")) |= (.use = "package_manager")' file.yml
- name: Package X Install
  package:
    name:
      - package_1
      - package_2
    state: present
    use: package_manager
- name: Package Y Install
  package:
    name: package_3
    state: present
    use: package_manager
- block:
    - name: Package Z Install
      package:
        name: package_4
        state: present
        use: package_manager

これは以下を使用します。yqパーサーvalue に対応するキーを含む各セクションにuse: package_managerkey+value を追加します。packagestatepresent

これは、すべてのデータを繰り返してキー値のある部分を選択することによってpackage行われます。次に、このセクションに新しいキーと値を追加します。statepresent

関連情報