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.

おすすめ記事