Команда SED в Linux — это... Неинтерактивный потоковый редактор, который считывает входные данные построчно, применяет текстовые преобразования с использованием шаблонов и правил и записывает результат в стандартный вывод или обратно в файлы.
Используйте sed для поиска и замены, выделения строк, удаления, вставки и быстрой автоматизации в скриптах, конвейерах обработки данных и администрировании серверов.
Если вы новичок в команде sed в Linux, это руководство пользователя расскажет вам обо всем: от базового синтаксиса до практических однострочных команд, используемых в задачах хостинга, DevOps и системного администрирования.
Вы изучите основы работы с sed, продвинутые методы и безопасное редактирование кода на месте, объясненные на простых примерах, которые вы сможете запустить немедленно.
Что такое команда SED в Linux?

sed (сокращение от stream editor) — это мощный инструмент обработки текста для фильтрации и преобразования текста. Он идеально подходит для пакетной обработки, автоматизации изменений конфигурации, очистки логов, извлечения данных и интеграции в скрипты командной оболочки.
В отличие от текстового редактора, sed редактирует потоки данных, поступающих из файлов или команд, что делает его идеальным для конвейерной обработки и неинтерактивных операций.
Как SED Работы: Потоковая модель и основной синтаксис
Основной синтаксис
SED Обрабатывает входные данные построчно, применяет команды к каждой строке, соответствующей адресу или шаблону, и выводит результат. Общая форма:
sed [OPTIONS] 'address(es) command(s)' file(s)
# Common usage examples
sed 's/old/new/' file.txt # Replace first 'old' on each line
sed -n '1,10p' file.txt # Print only lines 1 through 10
sed '/error/d' app.log # Delete lines that match 'error'
- -н: Отключить автоматическую печать (используйте с p для управления выводом)
- -i[СУФФИКС]: Редактировать файлы на месте (опционально с добавлением суффикса резервной копии, например, -i.bak)
- -Э: использовать расширенные регулярные выражения (предпочтительнее, чем устаревший параметр -r)
- -f script.sed: загрузка команд из файла
- -e 'cmd': добавить несколько команд в строку
Адреса и диапазоны
Адреса позволяют указывать конкретные строки. Вы можете использовать номера строк, регулярные выражения или диапазоны:
# Line numbers
sed -n '5p' file # Print line 5
sed -n '5,12p' file # Print lines 5 through 12
# Regex addresses (delimited by /.../)
sed -n '/ERROR/p' log # Print lines containing 'ERROR'
sed '/^#/d' config # Delete commented lines
# Mixed ranges and address negation
sed '/START/,/END/p' file # Print between lines matching START and END
sed '/^$/!p' file # Print all non-empty lines (! negates the address)
Основные команды SED с практическими примерами
Выделение и печать строк (p, -n, q, =)
# Print only matching lines (-n + p)
sed -n '/nginx/p' /etc/nginx/nginx.conf
# Show line numbers for matches
sed -n '/PermitRootLogin/=' /etc/ssh/sshd_config
# Stop after first match (faster on huge files)
sed '/CRITICAL/q' app.log
Найти и заменить текст (s///)
Команда `s/regex/repl/flags` находит совпадения и заменяет их. Используйте другой разделитель, чтобы избежать сложной экранировки.
# Replace first match per line
sed 's/foo/bar/' file
# Replace all matches per line (global)
sed 's/foo/bar/g' file
# Case-insensitive replace (GNU sed)
sed 's/linux/Linux/Ig' notes.txt
# Use an alternate delimiter to avoid escaping slashes (e.g., paths)
sed 's#/var/www/html#/srv/www#' vhost.conf
# Replace only on lines that match an address
sed '/^server_name/s/example.com/example.org/' site.conf
# Replace only the 2nd occurrence per line
sed 's/foo/bar/2' input.txt
# Use captured groups and the & (whole match)
sed -E 's/([0-9]{3})-([0-9]{2})-([0-9]{4})/***-**-\3/g' data.txt
sed -E 's/error:<([^>]+)>/issue:&[\1]/' log.txt
Вставка, добавление и изменение строк (i, a, c)
# Insert a line before matches
sed '/^\[mysqld\]/i # Managed by automation' my.cnf
# Append a line after matches
sed '/listen 80;/a listen 443 ssl;' nginx.conf
# Change matching lines entirely
sed '/^DocumentRoot/c DocumentRoot "/srv/www/example"' httpd.conf
Удалить строки (d)
# Remove comments and empty lines
sed -E '/^\s*($|#)/d' file
# Delete a known range
sed '10,20d' file
# Delete everything outside a block (negate the range)
sed '/BEGIN/,/END/!d' file
Множественные правки за один запуск (-e, ;, -f)
# Chain commands with -e
sed -E -e 's/\s+$//' -e 's/^\s+//' input.txt
# Or separate with semicolons
sed -E 's/\s+$//; s/^\s+//' input.txt
# Load from a script file
sed -f fixup.sed input.txt
# Example fixup.sed:
# s/localhost/127.0.0.1/g
# /^#/d
# /^\s*$/d
Безопасное редактирование на месте (-i) и советы по переносу.
Редактирование файлов на месте удобно, но рискованно, если вы не делаете резервные копии. Лучше сначала провести пробные запуски, а затем применить изменения на месте, добавив суффикс резервной копии.
# Dry run: preview changes
sed -E 's/http:/https:/g' site.conf | diff -u site.conf -
# Linux (GNU sed): create a backup
sed -i.bak 's/PermitRootLogin no/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
# macOS/BSD sed: empty string means no backup
sed -i '' -E 's#<Directory /var/www>#<Directory /srv/www>#' httpd.conf
Примечания по портативности:
- Используйте -E для расширенных регулярных выражений. В более старых версиях GNU sed также работает -r; в BSD/macOS предпочтительнее использовать -E.
- Флаг I, нечувствительный к регистру, — это GNU sed. Для обеспечения переносимости предварительно нормализуйте регистр или используйте классы символов.
- В macOS для отключения резервного копирования требуется параметр -i; в GNU sed параметр -i принимается без аргумента.
Расширенные возможности SED: регулярные выражения, многострочные запросы и задержечные пробелы.
Расширенные регулярные выражения и обратные ссылки
С параметром -E вы получаете доступ к современным функциям регулярных выражений, таким как +, ?, |, и группировка без обратных косых черт. Обратные ссылки позволяют повторно использовать захваченные группы в заменах. Символ & расширяется на всё совпадение.
# Normalize repeated whitespace to a single space
sed -E 's/[[:space:]]+/ /g' file
# Swap first and last name
sed -E 's/^([A-Za-z]+)\s+([A-Za-z]+)$/\2 \1/' names.txt
# Keep only digits from each line
sed -E 's/[^0-9]+//g' data.txt
Многострочное редактирование (N) и соединение строк
По умолчанию команда sed работает построчно. Используйте клавишу N, чтобы добавить следующую строку в пространство шаблона и работать за пределами строк.
# Join pairs of lines with a space
sed 'N; s/\n/ /' file
# Remove blank lines that follow another blank line (collapse multiple blanks)
sed -E ':a; /^\s*$/N; s/^\s*\n+/\n/; ta' file
# Replace a token that may be split across two lines
sed 'N; s/TOKEN\nCONTINUED/TOKEN CONTINUED/; P; D' file
Приёмы удержания пробелов (h, H, g, G, x)
SED имеет два буфера: Пространство шаблона (текущая строка) и пространство удержания (блокнот). Перемещайте данные между ними для реализации сложной логики.
# Print each line along with the previous line
sed '1!G; h; $!p' file
# Swap current and previous lines
sed 'x; 1!p; h' file
Ветвление и условные замены (b, t)
Для построения условных потоков используйте ветвление по меткам. Команда `t` выполняет ветвление только в случае успешной подстановки.
# If we replaced 'alpha', also replace 'beta' on the same line
sed -E ':start; s/alpha/A/g; t next; b end; :next s/beta/B/g; :end' file
Практические советы по использованию SED для системных администраторов и специалистов по DevOps
Эти практические примеры помогают решить распространенные задачи. серверы и в CI/CD трубопроводы.
1) Удалите комментарии и пробелы в конце конфигурационных файлов:
sed -E 's/\s+$//; /^\s*($|#)/d' config.conf2) Массовое обновление HTTPS в Nginx виртуальные хосты:
find /etc/nginx/sites-available -type f -name '*.conf' -print0 \
| xargs -0 sed -i.bak 's/http:/https:/g'3) Поворачивайте журналы, сохраняя последние 1000 строк:
sed -n -e :a -e '$q;N;101,$D;ba' app.log > app.log.tail4) В целях конфиденциальности скрывайте имена пользователей электронной почты в журналах:
sed -E 's/([A-Za-z0-9._%+-])[A-Za-z0-9._%+-]*(@[A-Za-z0-9.-]+\.[A-Za-z]{2,})/\1***\2/g' access.log5) Преобразуйте разделитель CSV с запятой в табуляцию (не в кавычки – не усложняйте):
sed 's/,/\t/g' data.csv > data.tsv6) Изменять значение ключа только в пределах определенного блока:
sed -E '/<VirtualHost \*:80>/, /<\/VirtualHost>/ s/ServerName .*/ServerName example.org/' vhost.conf7) Удалите повторяющиеся смежные строки (простая дедупликация):
sed '$!N; /^\(.*\)\n\1$/!P; D' fileSED, awk и grep: когда что использовать?
- Используйте grep для фильтрации строк по шаблону. Это быстро, просто и лучше всего подходит для чистого сопоставления.
- Используйте sed для преобразования текстовых потоков: поиск/замена, удаление/вставка строк, небольшие логические операции и быстрые однострочные команды.
- Используйте awk для обработки данных с учетом столбцов, вычислений и структурированного вывода (например, отчетов в формате CSV/TSV).
Во многих конвейерах обработки данных их комбинируют: grep сужает область поиска, sed очищает/форматирует данные, awk агрегирует или вычисляет данные.
Производительность и передовой опыт
- Перед внесением изменений на месте проверьте с помощью параметров -n и p. Для большей уверенности используйте в паре с параметром diff.
- Команды заключаются в одинарные кавычки, чтобы предотвратить расширение оболочки: 's/$HOME/…/', а не “s/$HOME/…/”.
- Используйте интеллектуальные разделители (| # ~), чтобы избежать экранирования косых черт в путях и URL-адресах.
- Используйте символы ^ и $ для привязки шаблонов, чтобы уменьшить количество ложных срабатываний и ускорить сопоставление.
- Для более понятной структуры регулярных выражений предпочтительнее использовать параметр -E. Выражения должны оставаться читаемыми.
- Для больших задач сохраняйте правила в файле .sed (-f). Это повышает удобство сопровождения и скорость работы.
- Установите LC_ALL=C для более быстрой побайтовой обработки, когда правила Unicode не требуются.
- Обратите внимание на переносимость: различия между GNU и BSD в отношении флагов -i и регулярных выражений.
Безопасная практика на тестовом сервере.
При пакетном редактировании конфигурационных файлов или логов с помощью sed сначала протестируйте на тестовой среде. YouStable На VPS вы получаете полный корневой доступ, резервное копирование в виде снимков и многое другое. SSH Готовое решение — вы можете тестировать однострочные команды sed, мгновенно откатывать изменения и уверенно вносить их в рабочую среду. Это просто. Способ избежать рискованных изменений на действующих серверах.
Шпаргалка по SED: команды, которые вы будете использовать ежедневно.
- Печать: -n 'addr p' file
- Найти и заменить: 's/old/new/g'
- Удалить: 'addr d'
- Вставка/Добавление: 'addr i text' / 'addr a text'
- Изменить строку: 'addr c text'
- Номера строк: знак равно
- Несколько команд: -e 'cmd1' -e 'cmd2' или 'cmd1; cmd2'
- Расширенное регулярное выражение: -E
- Редактирование на месте: -i[.bak]
Распространенные ошибки и как их избежать
- Случайные глобальные изменения: Начните с узкого адреса, а затем расширьте его охват.
- Вопросы цитирования: Используйте одинарные кавычки; экранируйте только то, что необходимо sed.
- Перезапись без резервной копии: Всегда используйте флаг -i.bak или систему контроля версий.
- Жадность регулярных выражений: Используйте якоря и классы символов для точного сопоставления.
- Несоответствие платформ: Настройте флаги -i и регулярных выражений в macOS по сравнению с GNU/Linux.
Часто задаваемые вопросы (FAQ)
Для чего используется команда SED в Linux?
SED — это потоковый редактор, который автоматизирует преобразования текста, такие как поиск и замена, удаление или вставка строк и форматирование. Он широко используется в скриптах командной оболочки, конвейерах CI/CD, очистке логов и конфигурации. manageПотому что это быстро, позволяет использовать скрипты и работает построчно без открытия редактора.
Как мне рекурсивно заменить текст во всех файлах на SED-код?
Используйте команду find вместе с sed -i для безопасного рекурсивного редактирования:
find . -type f -name '*.conf' -print0 \
| xargs -0 sed -i.bak 's/old.domain/new.domain/g'
Это создаст резервную копию каждого файла с расширением .bak. Перед удалением резервных копий проверьте изменения с помощью команд git diff или diff.
В чём разница между GNU SED и BSD/macOS SED?
Ключевые различия заключаются в синтаксисе редактирования на месте (-i ” в macOS против -i в GNU) и некоторых флагах (GNU поддерживает I для регистронезависимого s///). Расширенное регулярное выражение -E в BSD/macOS, а также поддерживается в современной версии GNU sed. Проверяйте переносимость при написании кроссплатформенных скриптов.
Как можно редактировать файл на месте, не создавая резервную копию?
В GNU/Linux используйте параметр -i без суффикса. В macOS/BSD передайте пустую строку:
# GNU/Linux
sed -i 's/http:/https:/g' file
# macOS/BSD
sed -i ” 's/http:/https:/g' file
Как использовать расширенные регулярные выражения с SED?
Используйте параметр -E для включения расширенных регулярных выражений, чтобы вы могли писать более чистые шаблоны без излишнего экранирования:
sed -E 's/([A-Za-z]+)\s+([A-Za-z]+)/\2 \1/'names.txt
Как заменить только n-е вхождение в строке?
Добавьте номер вхождения в качестве флага к команде s. В этом примере заменяется только второе вхождение в каждой строке:
sed 's/error/warning/2' log.txt
Быстрее ли SED, чем awk или Python, при простых заменах?
Для простых операций поиска и замены или фильтрации строк sed обычно работает быстрее и использует меньше памяти, чем awk или Python, благодаря минимальным накладным расходам при запуске и потоковой обработке. Для структурированного анализа или вычислений awk/Python могут быть более подходящими, несмотря на компромисс в производительности.
Заключение
Используя эти методы и передовые практики, вы можете уверенно применять SED. команда в Linux Для автоматизации обработки текста, рефакторинга конфигураций и оптимизации рабочих процессов на сервере. Если вам нужна безопасная среда для экспериментов со снимками и полными версиями. SSHрассмотрите возможность тестирования на YouStable VPS перед внедрением изменений в рабочую среду.