Use o comando sed com variáveis

1

Eu tentei todas as soluções possíveis disponíveis no Stack Overflow e seus sites relacionados, mas não encontrei nenhuma solução. Eu passei uma quantidade razoável de tempo sobre esta questão e finalmente estou postando esta pergunta.

Eu quero usar o comando sed com variáveis shell. Meu script é bem simples:

## string to replace is the text after comma in the variable pc.
to_replace=${pc#*,}
echo $to_replace

##text to be replaced by the following line
replace_with="PARTITIONED BY ($pc1);"
echo $replace_with

## use sed command to replace.
sed "s@$to_replace@$replace_with@" $entry  ## $entry is the variable that contains the file name

Os dois comandos echo fornecem as seguintes saídas, respectivamente:

PARTITIONEDED BY (date_key );  ## the text I want to be replaced
PARTITIONED BY ( date_key int );  ## the text I want to replace with

Ou recebo um erro:

sed: -e expression #1, char 2: unterminated 's' command

ou o texto não é substituído.

Alguém por favor ajude. Eu estou usando o Centos 6 (se isso importa). Obrigado antecipadamente!

    
por kskp 21.04.2017 / 16:31

2 respostas

3
sed: -e expression #1, char 2: unterminated 's' command

A mensagem de erro diz que o erro acontece no segundo caractere, o que parece curioso. Eu posso reproduzir isso colocando uma nova linha no início da primeira variável:

$ a=$'\nfoo'
$ b='bar'
$ sed "s@$a@$b@"
sed: -e expression #1, char 2: unterminated 's' command

Uma nova linha sem escape encerra o comando sed. Colocar a nova linha mais tarde em a , é claro, forneceria o erro em um caractere posterior.

Você imprimiu as duas variáveis anteriormente no script, mas elas não foram citadas, portanto, qualquer espaço em branco inicial teria sido removido e espaços em branco no meio seriam exibidos como espaços únicos.

Verifique o que suas variáveis realmente contêm, com algo parecido com isto:

printf ">%s<\n" "$to_replace"
printf "%q\n" "$to_replace"

O último é um recurso de Bash que exibe a string citada de uma maneira que o Bash aceita como entrada. set -x também mostrará o que vai para a linha de comando do sed, mas você precisa observar a nova linha literal de sua saída.

Então, se uma única nova linha de comando é tudo, você pode removê-la no começo do script:

to_replace=${pc#*,}
to_replace=${to_replace#$'\n'}

(Você pode combiná-los em um, mas etapas separadas funcionam mesmo que a nova linha não esteja lá.)

    
por 21.04.2017 / 17:23
-3

Tente isso

sed -i -e "s@$to_replace@$replace_with@g" "$entry"

onde

  • -i significa substituir "no lugar", se você não usar -i replace estará na saída padrão.
por 21.04.2017 / 16:50