Заменить текст другим

Я хотел бы заменить строку другой строкой. Например: я хотел бы изменить следующий текст:

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

к следующему тексту

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

Я попробовал эту команду:

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

и я получил этот результат:

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

вывод : listen_addresses = ['127.0.0.1:53', '[::1]:53']

Что я делаю неправильно?

как поясняется в комментарии, только [ и ] следует избегать

 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'#" 

которые дают

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

Ты можешь сделать:

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

  • Ищет точную строку listen_addresses = ['127.0.0.1:53', '[::1]:53']
  • Если строка соответствует s/53/40/g , заменит все 53 от 40 (но только в соответствующей строке)

Пример вывода:

 $ 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'] 

Как видите, для замены необходимо точное совпадение.

 sed s/":53'"/":40'"/g <<<"listen_addresses = ['127.0.0.1:53', '[::1]:53']" 

сделать что-то близкое к тебе, спросил. Но я согласен с комментарием @Джеффа Шаллера!

По вашему вопросу никто не может понять, почему вы просто не делаете это вручную? Из какого текста вы получаете свои строки, чем они отличаются друг от друга? какие варианты должны быть охвачены регулярным выражением?

sed подходит для замены, но для выбора линии coresct лучше grep .