SED 或 AWK?:在找到的模式后向每行添加字符

SED 或 AWK?:在找到的模式后向每行添加字符

我正在使用 Jenkins 多行字符串参数将新条目附加到 yaml 文件。但随后我想格式化这些条目以匹配 yaml 语法。

期望的最终结果是:

var:
  - subvar1
  - subvar2
  - subvar3
  ...

到目前为止我所做的是:

我正在运行一个 shell 脚本,它采用看起来像的多行字符串参数(环境变量)subvar1\nsubvar2\nsubvar3并将其附加到 yaml 文件中。所以,我的行代码如下所示:

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

相关内容