Только для посетителей нашего блога: получите дополнительные 3 месяца бесплатно + скидку 10% на трехгодичный план YSBLOG10
Захватить сделку

Команда SED в Linux | Полное руководство пользователя (примеры + советы)

Команда SED в Linux — это... Неинтерактивный потоковый редактор, который считывает входные данные построчно, применяет текстовые преобразования с использованием шаблонов и правил и записывает результат в стандартный вывод или обратно в файлы.

Используйте sed для поиска и замены, выделения строк, удаления, вставки и быстрой автоматизации в скриптах, конвейерах обработки данных и администрировании серверов.

Если вы новичок в команде sed в Linux, это руководство пользователя расскажет вам обо всем: от базового синтаксиса до практических однострочных команд, используемых в задачах хостинга, DevOps и системного администрирования.

Вы изучите основы работы с sed, продвинутые методы и безопасное редактирование кода на месте, объясненные на простых примерах, которые вы сможете запустить немедленно.


Что такое команда SED в Linux?

Что такое команда 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.conf

2) Массовое обновление 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.tail

4) В целях конфиденциальности скрывайте имена пользователей электронной почты в журналах:

sed -E 's/([A-Za-z0-9._%+-])[A-Za-z0-9._%+-]*(@[A-Za-z0-9.-]+\.[A-Za-z]{2,})/\1***\2/g' access.log

5) Преобразуйте разделитель CSV с запятой в табуляцию (не в кавычки – не усложняйте):

sed 's/,/\t/g' data.csv > data.tsv

6) Изменять значение ключа только в пределах определенного блока:

sed -E '/<VirtualHost \*:80>/, /<\/VirtualHost>/ s/ServerName .*/ServerName example.org/' vhost.conf

7) Удалите повторяющиеся смежные строки (простая дедупликация):

sed '$!N; /^\(.*\)\n\1$/!P; D' file

SED, 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 перед внедрением изменений в рабочую среду.

Отправить по:

Прахлад Праджапати

Пралад — специалист по веб-хостингу и эксперт по органическому росту сайтов с упором на SEO из Индии. Активно работая в цифровом пространстве с 2019 года, он помогает людям развивать свои веб-сайты с помощью эффективных и устойчивых стратегий. Увлеченный обучением и быстрой адаптацией, он считает, что мелкие детали приводят к большому успеху. Узнайте его мнение о веб-хостинге и SEO, чтобы улучшить свое присутствие в интернете.

Оставьте комментарий

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *

Наверх