awk로 sed: 파일을 한 줄씩 읽고 다른 파일의 특정 줄에 추가

awk로 sed: 파일을 한 줄씩 읽고 다른 파일의 특정 줄에 추가

다음 두 파일을 고려하십시오 users.txt.

Arnold.Bosch
David.Ledru
Mehri.Sunny

그리고 docker-compose.txt:

version: '3.9'
services:
  strongswan-server:
    image: vpn-strongswan
    container_name: strongswan-server

    networks:
      strongswan-server:
    environment:
      - STRONGSWAN_CLIENTS=
    sysctls:
    volumes:
    ports:
      - 500:500/udp
      - 4500:4500/udp
volumes:
  strongswan-server-conf:
networks:
  strongswan-server:

다음 스크립트는 sed필터를 사용하여 STRONGSWAN_CLIENTS.

#!/bin/bash
while IFS= read -r line; do
    echo "Text read from file: $line"
  
    sed -i "10s/$/ $line/" $2

done < "$1" 

environment:
  - STRONGSWAN_CLIENTS=Arnold.Bosch David.Ledru Mehri.Sunny

이것을 달성하는 또 다른 방법이 있는지 궁금합니다 awk.

답변1

STRONGSWAN_CLIENTS 줄 끝에 추가되는 코드의 기능과 수행하려는 작업을 수행하는 방법은 다음과 같습니다.

$ awk 'NR==FNR{users=users OFS $0; next} /STRONGSWAN_CLIENTS=/{$0=$0 users} 1' users.txt docker-compose.txt
version: '3.9'
services:
  strongswan-server:
    image: vpn-strongswan
    container_name: strongswan-server

    networks:
      strongswan-server:
    environment:
      - STRONGSWAN_CLIENTS=users Arnold.Bosch David.Ledru Mehri.Sunny
    sysctls:
    volumes:
    ports:
      - 500:500/udp
      - 4500:4500/udp
volumes:
  strongswan-server-conf:
networks:
  strongswan-server:

답변2

다음의 jq래퍼를 사용하세요.yqhttps://kislyuk.github.io/yq/YAML 파일을 읽으려면 docker-compose.txt문서 구조에서 올바른 배열의 올바른 부분을 찾아 파일에서 읽은 데이터로 바꿉니다 users.txt.

yq -y -n '
    input | (
        .services."strongswan-server".environment[] | 
        select(startswith("STRONGSWAN_CLIENTS="))
    ) = "STRONGSWAN_CLIENTS=" + input' docker-compose.txt users.txt

이렇게 하면 모든 입력의 기본 읽기가 비활성화되고 대신 -n표현식의 첫 번째 명령어를 사용하여 첫 번째 입력 파일을 읽습니다. 읽은 후에 배열은 텍스트로 시작하는 텍스트 요소를 찾기 위해 반복됩니다. 일단 발견되면 두 번째 입력 파일에서 발견된 내용이 뒤따르는 문자열로 대체됩니다.inputjqenvironmentSTRONGSWAN_CLIENTS=STRONGSWAN_CLIENTS=

질문의 데이터에 대한 결과를 제공합니다.

version: '3.9'
services:
  strongswan-server:
    image: vpn-strongswan
    container_name: strongswan-server
    networks:
      strongswan-server: null
    environment:
      - STRONGSWAN_CLIENTS=Arnold.Bosch David.Ledru Mehri.Sunny
    sysctls: null
    volumes: null
    ports:
      - 500:500/udp
      - 4500:4500/udp
volumes:
  strongswan-server-conf: null
networks:
  strongswan-server: null

더 짧은 변형, 항상 설정됨첫 번째배열 요소 environment:

yq -y -n 'input | .services."strongswan-server".environment[0] = "STRONGSWAN_CLIENTS=" + input'  docker-compose.txt users.txt

-yYAML 출력 옵션을 선택합니다 yq. 이것이 없으면 JSON 출력( -tTOML 및 XML 포함 -x)을 얻게 됩니다.

답변3

사용 sedtr

$ sed "s/- STRONGSWAN_CLIENTS=/&$(tr '\n' ' ' < users.txt)/" docker-compose.txt
version: '3.9'
services:
  strongswan-server:
    image: vpn-strongswan
    container_name: strongswan-server

    networks:
      strongswan-server:
    environment:
      - STRONGSWAN_CLIENTS=Arnold.Bosch David.Ledru Mehri.Sunny 
    sysctls:
    volumes:
    ports:
      - 500:500/udp
      - 4500:4500/udp
volumes:
  strongswan-server-conf:
networks:
  strongswan-server:

답변4

STEP1:

rep=$(perl -pne "s/\n/ /g" f1)

STEP2:

sed -i "/STRONGSWAN_CLIENTS=/s/.*/&$rep/g" f2

산출

version: '3.9'
services:
  strongswan-server:
    image: vpn-strongswan
    container_name: strongswan-server

    networks:
      strongswan-server:
    environment:
      - STRONGSWAN_CLIENTS=Arnold.Bosch David.Ledru Mehri.Sunny 
    sysctls:
    volumes:
    ports:
      - 500:500/udp
      - 4500:4500/udp
volumes:
  strongswan-server-conf:
networks:
  strongswan-server:

관련 정보