sed потоковый редактор

Тема дорожной карты · Linux & Unix Fundamentals

sed — это неинтерактивный потоковый редактор, который применяет скрипты построчно для обработки текстовых данных. Он особенно полезен для быстрых и предсказуемых правок текстовых файлов. Основной функциональностью sed является замена текста, выполнение которой осуществляется с помощью команды s (substitute). Например, команда sed 's/old/new/g' file заменяет все вхождения строки old на строку new в файле file. Для внесения изменений в файле на месте используется опция -i, которая позволяет создать резервную копию файла перед изменением.

sed также поддерживает адресные диапазоны, позволяющие выполнить команды только на определённых строках. Например, команда '10,20s/...//' выполняет замену только на строках с 10 по 20. Команда '/^#/d' удаляет все строки, начинающиеся с символа #. Для выполнения нескольких выражений можно использовать опцию -e, которая позволяет объединить несколько команд в один скрипт. Расширенные регулярные выражения можно использовать с помощью опции -E.

Кроме замены текста, sed поддерживает другие команды, такие как d (удалить строку), p (вывести строку), a (добавить текст после текущей строки), i (вставить текст перед текущей строкой), c (заменить текущую строку текстом), а также циклы N (добавить следующую строку в текущую строку), D (удалить текущую строку и добавить следующую строку в текущую строку), G (добавить содержимое буфера в конец текущей строки), и h (копировать текущую строку в буфер). Эти команды позволяют выполнять сложные трансформации текста.

Как это работает

sed потоковый редактор — это инструмент, который делает пайплайны мощными. Он работает в связке с другими утилитами, такими как grep (поиск по регулярным выражениям), awk (обработка текста на основе записей), cut/paste (нарезка по столбцам), sort/uniq (обработка множеств), tr (трансляция символов), head/tail (нарезка файла), wc (счётчик строк, слов и байтов), и xargs (преобразование стандартного ввода в аргументы командной строки). С помощью пайплайнов (|) можно создавать сложные команды, которые выполняют различные операции над текстовыми данными. Например, команда cat access.log | grep 404 | awk '{print $7}' | sort | uniq -c | sort -rn | head отвечает на вопрос "какие URL чаще всего возвращают код 404" без необходимости писать скрипт на языке программирования.

Когда применять

Эти инструменты полезны для ad-hoc анализа логов, обработки CSV файлов, быстрой статистики и мелких трансформаций. Они особенно полезны, когда требуется быстрое решение для конкретной задачи, и нет необходимости писать сложный скрипт на языке программирования. awk полезен, когда данные представляют собой записи с полями, и требуется обработка этих записей. sed особенно полезен для замены текста с помощью регулярных выражений. grep -E (расширенные регулярные выражения) или grep -P (PCRE) полезны, когда требуется большая мощность в поиске. Для многошаговых трансформаций, которые требуется выполнять повторно, лучше оформить их в shell-скрипт или перейти на использование настоящего языка программирования.

Типичные ошибки

Основные ловушки при использовании sed включают жадные регулярные выражения, которые могут захватывать больше символов, чем было запланировано. Также следует учитывать зависимость от локали при сортировке, так как она может влиять на порядок сортировки строк. Различия между версиями sed (GNU vs BSD) могут вызвать проблемы с опцией -i, так как она работает по-разному в разных системах. Некорректное использование команд подстановки ($(command substitution)) может привести к проблемам с разделением слов. Наконец, использование команды cat для передачи данных в grep (UUOC — useless use of cat) может быть излишним, если можно выполнить ту же задачу напрямую, передав файл в качестве аргумента команды grep.

Связанные понятия

Полезные ресурсы