SED 또는 AWK? :발견된 패턴 뒤의 각 줄에 문자를 추가합니다.

SED 또는 AWK? :발견된 패턴 뒤의 각 줄에 문자를 추가합니다.

Jenkins 여러 줄 문자열 매개 변수를 사용하여 yaml 파일에 새 항목을 추가하고 있습니다. 하지만 yaml 구문과 일치하도록 이러한 항목의 형식을 지정하고 싶습니다.

원하는 최종 결과는 다음과 같습니다.

var:
  - subvar1
  - subvar2
  - subvar3
  ...

지금까지 내가 한 일은 다음과 같습니다.

저는 다음과 같은 여러 줄 문자열 인수(환경 변수)를 가져와서 subvar1\nsubvar2\nsubvar3yaml 파일에 추가하는 셸 스크립트를 실행하고 있습니다. 따라서 내 코드 줄은 다음과 같습니다.

printf "var:\n${HOSTNAMES}" >> ${WORKSPACE}/group_vars/all

후속 yaml 파일은 다음과 같습니다.

var:
subvar1
subvar2
subvar3

두 개의 공백과 하이픈을 추가한 다음 각 후속 줄 앞에 공백을 추가하는 방법에 대한 도움을 찾고 있습니다.var:

편집하다: SED나 AWK가 좋은 생각이 아니라면 더 나은 접근 방식은 무엇입니까?

답변1

해당 변수의 리터럴 개행 문자인 경우 다음을 수행할 수 있습니다.

HOSTNAMES='subvar1
subvar2
subvar3'
(IFS=$'\n'; printf -- "- %s\n" $HOSTNAMES)   # variable is unquoted
- subvar1
- subvar2
- subvar3

\리터럴 과 문자가 있는 경우 n결과는 동일합니다.

HOSTNAMES='subvar1\nsubvar2\nsubvar3'
printf "$HOSTNAMES\n" | sed 's/^/- /'

답변2

Bash 배열 사용:

$ HostNames=( host1 "host two" host3 )
$ { printf 'var:\n' ; printf -- '  - %s\n' "${HostNames[@]}"; } > somefile
$ 
$ cat somefile
var:
  - host1
  - host two
  - host3

관련 정보