No ksh93 e zsh, há uma construção de substituição de string ${VARIABLE//PATTERN/REPLACEMENT}
, usada duas vezes no snippet a seguir: uma vez para substituir '
por ''
e uma vez para substituir novas linhas por '+char(10)+'
. Se não houver novas linhas na string de entrada, você poderá omitir o segundo comando de atribuição.
quoted_string=\'${raw_string//\'/\'\'}\'
quoted_string=${quoted_string//$'\n'/"'+char(10)+'"}
Esta construção também está disponível no bash, mas as regras de cotação são diferentes. O snippet a seguir funciona em todos os ksh93, bash e zsh.
quoted_string=\'${raw_string//$'\''/$'\'\''}\'
quoted_string=${quoted_string//$'\n'/$'\'+char(10)+\''}
No ksh88 e outras shells, você precisa escrever um loop relativamente complexo para substituir as aspas simples uma de cada vez. O snippet a seguir duplica aspas simples, mas deixa as novas linhas inalteradas).
q="$raw_string"; quoted_string=
while
quoted_string="$quoted_string'${q%%\'*}'"
case "$q" in *\'*) q="${q#*\'}";; *) false;; esac
do :; done
Como alternativa, você pode usar sed. Tenha cuidado ao alimentar os dados para sed, já que echo
nem sempre imprime seu argumento como está.
quoted_string="'$(printf '%s\n' "$raw_string" |
sed -n -e "s/'/''/g" -e 'H' \
-e '$ g' -e 's/^\n//' -e "s/\n/'+char(10)+'/g" -e '$ p')'"
Se não houver novas linhas na string, o seguinte comando muito mais simples é suficiente.
quoted_string="'$(printf '%s\n' "$raw_string" | sed -e "s/'/''/g")'"