Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Sed + variavel especial

Professor, uma pergunta que tenho praticando o shell script é: Como usar o sed para substituir variaveis em arquivos, sendo que essas variaveis possuem caracteres especiais (@!*)? Exemplo: sed -i "s|$variavel_caracter_especial10|$variavel_caracter_especial|g" "/home/teste.txt"

Estou fazendo alguns testes porém parece que o sed não lida bem com caracteres especiais em variaveis,

por exemplo, eu dando um echo na $variavel_caracter_especial10 obtenho o retorno correto, mas dentro do sed não retorna nada

poderia me dar alguma dica?

5 respostas

Olá Alisson, tudo bem?

O sed é uma ferramenta muito poderosa para manipulação de arquivos de texto em shell script. Para substituir variáveis que possuem caracteres especiais, você pode utilizar a barra invertida () antes do caractere especial para que o sed entenda que ele faz parte da variável e não da expressão regular.

No seu exemplo, você pode tentar utilizar a seguinte sintaxe:

sed -i "s|${variavel_caracter_especial10//\//\\/}|${variavel_caracter_especial//\//\\/}|g" "/home/teste.txt"

Nessa sintaxe, utilizamos a barra invertida antes de cada barra (/) que aparece na variável para que o sed entenda que ela faz parte da variável e não da expressão regular. Além disso, utilizamos a sintaxe ${variavel//procura/substitui} para substituir todas as ocorrências da variável com caracteres especiais pela variável sem caracteres especiais.

Espero ter ajudado e bons estudos!

Boa tarde Otavio, tudo certo e contigo?

Deu certo sim, o unico problema é quando a variavel possue &.

Quando o valor da variavel possue &, ele acaba concatenando e não substituindo.

Exemplo:* variavel_caracter_especial=fNOl!Svp7ijYQ&§Ks@an**

Estou testando algumas possíveis soluções, mas ate o momento sem sucesso. Estou efetuando algumas buscas baseando em regex, mas não tenho muito conhecimento a respeito. (Ja estou aproveitando pra estudar expressões regulares, pois vi que é bastante importante

Sabe o que pode ser?

Obrigado

Deu certo, obrigado !

Uma ultima duvida, como seria se o usuario fosse o responsavel por passar o valor dessa variavel?

Visto que eu teria que escapar os caracteres especiais para o sed?

Ex: Aqui o valor da variavel está definida no codigo, então utilizei o contra barra pra escapar os caracteres especiais, e então jogar pro sed. (Testei e sem escapar tava dando erro com os caracteres &** **$)

variavel2="2343434KD#4t'gm&C5$Wr_59mLP"

sed -i "s|${variavel1/////\/}|${variavel2////}|g" "/home/teste.txt"

Mas se o valor da variavel vier do usuario, como usar pra passar pro sed? Como escapar? Ou alguma outra ideia?

variavel2="**"

*Resumindo até o momento eu não consegui escapar os caracteres & $ dentro do sed. *

solução!

Olá Alisson,

Fico feliz em saber que a minha resposta anterior foi útil para você!

Quanto à sua última dúvida, se o valor da variável vier do usuário, você pode utilizar o comando sed em conjunto com o comando printf para escapar os caracteres especiais. Por exemplo:

read -p "Digite o valor da variável: " variavel2
variavel2_escaped=$(printf '%s\n' "$variavel2" | sed -e 's/[\/&]/\\&/g')
sed -i "s|${variavel1////\\/}|${variavel2_escaped////\\/}|g" "/home/teste.txt"

Nesse exemplo, primeiro usamos o comando read para receber o valor da variável a partir da entrada do usuário. Em seguida, usamos o comando printf para enviar o valor da variável para o comando sed e escapar os caracteres especiais. O resultado é armazenado na variável variavel2_escaped, que pode ser usada no comando sed para substituir a variável no arquivo de texto.

Espero ter ajudado!

Bom dia Otavio,

Deu certo, muito obrigado pela ajuda !