SED ou AWK ?: Adicionar caractere a cada linha após o padrão encontrado

0

Estou usando o parâmetro de cadeia de várias linhas Jenkins para anexar novas entradas a um arquivo yaml. Mas, em seguida, quero formatar essas entradas para corresponder à sintaxe yaml.

O resultado final desejado é:

var:
  - subvar1
  - subvar2
  - subvar3
  ...

O que eu fiz até agora é:

Estou executando um script de shell que usa esse parâmetro de cadeia de várias linhas (uma variável de ambiente) que se parece com subvar1\nsubvar2\nsubvar3 e o acrescenta ao arquivo yaml. Então, meu código de linha é assim:

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

O arquivo yaml se parece com isso depois disso:

var:
subvar1
subvar2
subvar3

Estou procurando ajuda de vocês sobre como adicionar dois espaços e um hífen e um espaço antes de cada linha que vem após var:

EDITAR : Se o SED ou o AWK não são uma boa ideia para fazer isso, qual é a melhor maneira de fazer isso?

    
por Fadi 28.02.2017 / 18:48

2 respostas

1

Se essas são novas linhas literais nessa variável, você pode fazer:

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

Se você tiver os caracteres literais \ e n , isso terá o mesmo resultado:

HOSTNAMES='subvar1\nsubvar2\nsubvar3'
printf "$HOSTNAMES\n" | sed 's/^/- /'
    
por 28.02.2017 / 19:43
1

Com uma matriz bash:

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