Substituir texto por outro

0

Eu gostaria de substituir uma string por outra string. Por exemplo: Eu gostaria de alterar o seguinte texto:

"listen_addresses = ['127.0.0.1:53', '[::1]:53']"

para o seguinte texto

"listen_addresses = ['127.0.0.1:40', '[::1]:40']"

Eu tentei este comando:

sudo sed "s#listen_addresses \= \['127\.0\.0\.1\:53'\, '\[\:\:1\]\:53'\]'#listen_addresses \= \['127\.0\.0\.1\:40'\, '\[\:\:1\]\:40'\]#g"

e eu tenho esse resultado:

entrada : listen_addresses = ['127.0.0.1:53', '[::1]:53']

saída : listen_addresses = ['127.0.0.1:53', '[::1]:53']

O que estou fazendo de errado?

    
por a.gulcan 03.09.2018 / 14:09

3 respostas

1

como explicado no comentário, apenas [ e ] devem ser ignorados

echo "listen_addresses = ['127.0.0.1:53', '[::1]:53']" |
sed -e "s#listen_addresses = \['127.0.0.1:53', '\[::1\]:53'#listen_addresses = ['127.0.0.1:40', '[::1]:40'#"

que dão

listen_addresses = ['127.0.0.1:40', '[::1]:40']
    
por 03.09.2018 / 14:25
0

Você pode fazer:

sed "/^listen_addresses = \['127\.0\.0\.1:53', '\[::1\]:53'\]$/s/53/40/g" file
  • Procura a string exata listen_addresses = ['127.0.0.1:53', '[::1]:53']
  • Se a string corresponder a s/53/40/g , todas as ocorrências de 53 serão substituídas por 40 (mas apenas na linha correspondente)

Exemplo de saída:

$ cat file
listen_addresses = ['127.0.0.1:53', '[::1]:53']
listen_addresses = ['127.0.0.2:53', '[::1]:53']

$ sed "/^listen_addresses = \['127\.0\.0\.1:53', '\[::1\]:53'\]$/s/53/40/g" file
listen_addresses = ['127.0.0.1:40', '[::1]:40']
listen_addresses = ['127.0.0.2:53', '[::1]:53']

Como você pode ver, uma correspondência exata é necessária para realizar a substituição.

    
por 03.09.2018 / 14:24
0
sed s/":53'"/":40'"/g <<<"listen_addresses = ['127.0.0.1:53', '[::1]:53']"

faça algo próximo a você. Mas eu concordo com o comentário de @Jeff Schaller!

Da sua pergunta ninguém pode reconhecer porque você simplesmente não o faz manualmente? Qual é o texto a partir do qual você obtém suas linhas, como elas diferem uma da outra? Quais variantes devem ser cobertas pelo regex?

sed é bom para substituir, mas para eleger a linha coresct, o grep é melhor.

    
por 03.09.2018 / 14:43