Просто удалите все до последней косой черты:
$ echo "blablabal/important" | sed 's:.*/::'
important
Это также работает с несколькими косыми чертами:
$ echo "blablabal/not/ver/interesting/important" | sed 's:.*/::'
important
как объясняется в комментарии, только [
и ]
должны экранироваться
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']"
сделать что-то близкое к вам спросил. Но я согласен с комментарием @Jeff Schaller!
Из вашего вопроса никто не может понять, почему вы просто не делаете это вручную? Каков текст, из которого вы получаете свои строки, чем они отличаются друг от друга? какие варианты должны быть покрыты регулярным выражением?
sed
хорош для замены, но для выбора основной линии лучше grep
.