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 플레이북에는 다른 용도가 있기 때문에 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

관련 정보