Substitui todas as ocorrências de um caractere em uma variável usando o script korn

3

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.

    
por Ben 03.08.2011 / 19:59

2 respostas

-1

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
    
por 03.08.2011 / 20:48
5

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")'"
    
por 03.08.2011 / 22:29