Como lidar com strings de múltiplas linhas e interpolação de strings?

1

Digamos que eu queira ter um modelo em algum lugar que seja string multilinha:

I have some
text with ${placeholders}
in this and some ${different}
ones ${here} and ${there}

Qual seria a minha melhor maneira de substituir os espaços reservados pela entrada de um usuário? Os documentos aqui seriam um bom uso?

    
por dagda1 04.04.2018 / 12:47

3 respostas

0

Dadas as entradas do usuário one , two , three

O comando a seguir substituirá todas as instâncias de um determinado ${placeholder} pela sua entrada:

sed -i 's/${placeholders}/one/g; s/${different}/two/g; s/${here}/three/g' yourTemplateFile

Se você usar isso em um script bash e tiver a entrada do usuário em variáveis shell, isso fará todas as substituições em um comando.

    
por 04.04.2018 / 14:32
0

Aqui está uma maneira de fazer isso no bash. Você precisa de uma versão recente porque eu confio em matrizes associativas aqui

template=$(cat << 'END_TEMPLATE'
I have some
text with ${placeholders}
in this and some ${different}
ones ${here} and ${there}
END_TEMPLATE
)

mapfile -t placeholders < <(grep -Po '(?<=\$\{).+?(?=\})' <<< "$template" | sort -u)

declare -A data
for key in "${placeholders[@]}"; do
    read -p "Enter the '$key' value: " -r data[$key]
done

t=$template
while [[ $t =~ '${'([[:alnum:]_]+)'}' ]]; do
    t=${t//"${BASH_REMATCH[0]}"/"${data[${BASH_REMATCH[1]}]}"}
    #      ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    #      |                    + the value the user entered
    #      + the placeholder in the text
done

echo "$t"
    
por 04.04.2018 / 17:55
0

Assumindo que [a] não \ < newline & gt ;, nem os caracteres \ , $ ou ' são usados na cadeia multilinha (ou são citados corretamente) , um documento aqui (e variáveis) é sua melhor opção:

#!/bin/sh

placeholders="value one"
different="value two"
here="value three"
there="value four"

cat <<-_EOT_
I have some
text with ${placeholders}
in this and some ${different}
ones ${here} and ${there}.
_EOT_

Se executado:

$ sh ./script
I have some
text with value one
in this and some value two
ones value three and value four.

Claro que, jogando corretamente com qouting, até mesmo uma variável poderia fazer:

$ multilinevar='I have some
> text with '"${placeholders}"'
> in this and some '"${different}"'
> ones '"${here}"' and '"${there}"'.'
$ echo "$multilinevar"
I have some
text with value one
in this and some value two
ones value three and value four.

Ambas as soluções podem aceitar espaços reservados variáveis de múltiplas linhas.

[a] No manual:

... the character sequence \<newline> is ignored, and \ must be used to quote the characters \, $, and '. ...

    
por 06.04.2018 / 00:20