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

2つのスペースとハイフンを追加してから、後続の各行の前にスペースを追加する方法を探しています。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

関連情報