Linux Labs

Bash: обработка текста и скрипты / Ступень 2 из 9

sed и awk: правка и поля потока

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 2 из 9 · на машине · 5 мин

Поток, замена, адрес

sed поменял адрес в выводе дважды, а файл остался прежним. Здесь — почему так и как ограничить замену нужной строкой.

sed — потоковый редактор. Он читает файл или стандартный ввод по строке, выполняет над каждой строкой свою команду и печатает результат. Сам файл sed не трогает, поэтому cat показал прежний адрес.

Команда s/старое/новое/ заменяет в строке первое совпадение с шаблоном. Шаблон — регулярное выражение, как в grep, и ищется в любом месте строки: адрес нашёлся и в backend=, и в комментарии. Буква g в конце, s/старое/новое/g, заменяет все совпадения в строке.

Перед командой можно поставить адрес — шаблон в косых чертах. Тогда команда работает в строках, где шаблон совпал, а остальные строки sed печатает как есть:

bash
sed '/^timeout=/s/30/60/' site-01.conf

Таймаут сменился, а строки с адресом остались прежними: ни одна из них не начинается с timeout=.

Проверь себя 1 вопрос

В одном конфиге бэкенд другой — backend=10.0.0.50:8080. Что станет с этой строкой после sed '/^backend=/s/10\.0\.0\.5/10.0.0.9/'?

  • sed заменил совпавшие знаки, 10.0.0.5, а 0 после них остался на месте: вышло 10.0.0.90.

  • Шаблон ищется в любом месте строки: 10.0.0.5 — начало 10.0.0.50, и sed его заменил. Проверь: echo 'backend=10.0.0.50:8080' | sed 's/10\.0\.0\.5/10.0.0.9/'.

  • Ошибки нет: шаблон совпал с частью строки, и sed заменил эту часть.

Шаблон замены, как в grep, ищется в любом месте строки, и 10.0.0.5 совпал с началом 10.0.0.50. sed заменил совпавшие знаки и получил чужой адрес 10.0.0.90. Границу задаёт следующий знак в шаблоне: s/10\.0\.0\.5:/10.0.0.9:/ строку с 10.0.0.50 не тронет.

Главное в шаге

  • sed печатает изменённый поток, а файл оставляет как был.
  • s/старое/новое/ меняет первое совпадение в строке, с g — все.
  • Адрес /шаблон/ перед командой ограничивает её строками, где шаблон совпал.
Ubuntu 24.04
Загрузка…