다음 두 파일을 고려하십시오 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
래퍼를 사용하세요.yq
https://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
표현식의 첫 번째 명령어를 사용하여 첫 번째 입력 파일을 읽습니다. 읽은 후에 배열은 텍스트로 시작하는 텍스트 요소를 찾기 위해 반복됩니다. 일단 발견되면 두 번째 입력 파일에서 발견된 내용이 뒤따르는 문자열로 대체됩니다.input
jq
environment
STRONGSWAN_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
-y
YAML 출력 옵션을 선택합니다 yq
. 이것이 없으면 JSON 출력( -t
TOML 및 XML 포함 -x
)을 얻게 됩니다.
답변3
사용 sed
및tr
$ 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: