Existe algum motivo específico para você não chamar o sed de seu script ksh ?
Este script simples:
#!/bin/ksh
foo="left ' right"
echo $foo
foo=$(echo "$foo" | sed "s#\'#\'\'#g")
echo $foo
me dá esta saída:
left ' right
left '' right
Parte do script Korn que estou escrevendo requer que eu substitua todas as ocorrências do caractere ' por duas ocorrências ( '' ). Eu estou tentando registrar alguns SQL que estou gerando neste script para uma coluna em outra tabela, mas aspas simples precisam ser substituídas por duas instâncias do caractere aspas simples. Eu sei que deve haver exemplos dessa funcionalidade em algum lugar, mas não estou encontrando um exemplo de substituição de string específico para variáveis em qualquer lugar.
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")'"