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

Просто удалите все до последней косой черты:

$ echo "blablabal/important" | sed 's:.*/::'
important

Это также работает с несколькими косыми чертами:

$ echo "blablabal/not/ver/interesting/important" | sed 's:.*/::'
important
0
10.09.2018, 08:47
3 ответа

как объясняется в комментарии, только [и ]должны экранироваться

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']
1
28.01.2020, 02:42

Можно сделать:

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

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

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

сделать что-то близкое к вам спросил. Но я согласен с комментарием @Jeff Schaller!

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

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

0
28.01.2020, 02:42

Теги

Похожие вопросы