A substituição com sed não funciona como esperado com expansão variável, aparecem caracteres extras

0

Estou tendo alguns problemas com sed .

Eu preciso substituir uma string em um arquivo por algo, e eu fui parcialmente bem-sucedido com isso, mas estou obtendo uma string extra t na frente da saída real.

Estes são os comandos que estou usando

password=$(openssl rand -base64 8)
new_variable=$(echo -n "$password{s4lt}"  | sha256sum | awk '{print $1}')
to_be='#jbcrypt:$2a$10$mvkjME9eLxgvNu1f35SsSe5JKuVZaDf7xZX8DufaUMsMtDMzrGPUa'
with_be="<passwordHash>s4lt:${new_variable}</passwordHash>"

picada para ser substituída

<passwordHash>#jbcrypt:$2a$10$mvkjME9eLxgvNuMsMtDMzrGPUa</passwordHash>

com

<passwordHash>s4lt:c3b43792278faa66ffad524c6433bb755057455a0d43b4af4cab927dafc84f8a</passwordHash>

cmd usado

sed -i "/$to_be/c \t\t$with_be" /var/lib/jenkins/users/admin/config.xml

resultado

t   <passwordHash>s4lt:c3b43792278faa66ffad524c6433bb755057455a0d43b4af4cab927dafc84f8a</passwordHash>
    
por Mohd 28.05.2018 / 05:15

1 resposta

1

Como seu padrão contém / , você terá que informar sed para usar outro delimitador na expressão /$to_be/ range. Aqui, estou usando @ como o delimitador:

sed -i "\@$to_be@c\ \t\t$with_be" /var/lib/jenkins/users/admin/config.xml

Observe também a barra invertida após o comando c .

Um delimitador alternativo pode ser usado em uma expressão de intervalo se for escapado como mostrei acima. Quase qualquer caractere pode ser usado, exceto \ e nova linha. Você deve escolher um que não ocorra no valor de $to_be .

O comando c ("change") tem o formato

range c\
text

O GNU sed é indulgente porque permite que o texto de substituição ocorra na mesma linha do comando em si, ou seja, ele permite range c\ text .

    
por 28.05.2018 / 08:25