Потоковое редактирование с помощью sed

LinuxBeginner
Практиковаться сейчас

Введение

При работе с текстовыми файлами в Linux часто требуется автоматически изменять их, не открывая интерактивный текстовый редактор. Например, может понадобиться удалить заголовок из CSV-файла, убрать пустые строки или извлечь определённый диапазон строк из файла журнала.

Для таких задач используется sed (потоковый редактор).

sed — мощный неинтерактивный текстовый редактор. Он читает данные из файла или конвейера, выполняет операции над каждой строкой и выводит результат. Эта модель «прочитать, преобразовать, вывести» — классический подход Unix, который особенно хорошо подходит для конвейеров.

Именно поэтому sed называют потоковым редактором. Он предназначен для работы с проходящим через него текстом, а не только с файлами, открытыми в полноэкранном редакторе. Поэтому sed естественно использовать в конвейерах оболочки и сценариях автоматизации.

В этой лабораторной работе вы научитесь:

  1. Удалять строки (d): убирать ненужные заголовки или комментарии.
  2. Удалять пустые строки: использовать регулярные выражения для фильтрации пустых строк.
  3. Вставлять текст (i): добавлять в файл новые строки.
  4. Выводить строки (p): извлекать определённые диапазоны строк.

Удаление строк

Сначала просмотрите пример файла.

cat /home/labex/project/data.csv

Вы увидите, что в его начале находятся две строки комментариев, начинающиеся с #. Эти строки нужно удалить.

Для удаления строк в sed используется команда d.

  • 1d удаляет строку 1.
  • 1,2d удаляет строки с 1 по 2.

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

Выполните следующую команду, чтобы предварительно просмотреть результат удаления, не изменяя файл:

sed '1,2d' data.csv

В выводе содержимое файла показано без первых двух строк. Однако снова проверьте содержимое файла:

cat data.csv

Эти строки всё ещё находятся в файле. По умолчанию sed отправляет результат на экран, то есть в стандартный вывод, и не изменяет исходный файл. Это защищает файл от случайных изменений.

Чтобы применить изменения непосредственно к файлу, используйте параметр -i:

sed -i '1,2d' data.csv

Проверьте изменения:

cat data.csv

Теперь строки заголовка удалены из файла без возможности восстановления.

Удаление пустых строк

В файле всё ещё есть пустые строки, нарушающие структуру данных. В обработанных файлах данных такие строки обычно не нужны.

Чтобы удалить их, объедините команду удаления (d) с регулярным выражением (Regex).

  • ^ соответствует началу строки.
  • $ соответствует концу строки.
  • ^$ соответствует строке, которая начинается и сразу заканчивается, то есть пустой строке.

Это хороший пример сочетания в sed двух уровней: шаблона адреса и действия редактирования. Шаблон /^$/ выбирает подходящие строки, а d удаляет выбранные строки.

Команда /^$/d указывает sed: «удалить любую строку, соответствующую шаблону пустой строки».

Выполните команду, чтобы удалить пустые строки непосредственно из файла:

sed -i '/^$/d' data.csv

Проверьте результат:

cat data.csv

Теперь файл должен содержать компактный список данных без пропусков между строками.

Вставка текста

Теперь, когда ненужные комментарии удалены, добавим в файл заголовок с классификацией.

Команда i (Insert) добавляет текст перед указанной строкой.

  • 1i Text вставляет Text перед строкой 1.

Команда a (Append) добавляет текст после указанной строки.

  • 1a Text вставляет Text после строки 1.

Наряду с удалением и заменой команды i и a показывают, что возможности sed не ограничиваются заменой текста. По мере прохождения строк через редактор он может изменять поток: удалять, добавлять и выбирать строки.

Выполните следующую команду, чтобы вставить Company Confidential в самое начало файла:

sed -i '1i Company Confidential' data.csv

Проверьте содержимое файла:

cat data.csv

Новая строка вставлена в начало, поэтому все остальные строки сместились вниз.

Вывод определённых строк

Иногда файл не нужно изменять — требуется только извлечь из него определённые строки. В таком режиме sed может работать как более гибкая версия head или tail.

По умолчанию sed выводит каждую обрабатываемую строку. Чтобы вывести только определённые строки, выполните два действия:

  1. Используйте параметр -n, чтобы отключить автоматический вывод.
  2. Используйте команду p, чтобы явно вывести нужные строки.

Без -n команда sed сначала автоматически вывела бы каждую строку, а затем повторно вывела выбранные строки при выполнении p. Это часто сбивает начинающих с толку. Параметр -n отключает поведение по умолчанию, поэтому команда выводит только указанные вами строки.

Чтобы вывести строки с 5 по 10, выполните:

sed -n '5,10p' data.csv

Чтобы вывести только последнюю строку, используйте символ $, обозначающий конец файла:

sed -n '$p' data.csv

Это особенно полезно при анализе больших файлов журналов, когда нужно просмотреть только определённый фрагмент.

Итоги

В этой лабораторной работе вы изучили основы потокового редактирования с помощью sed:

  1. Удаление (d): удаление определённых строк (1,2d) или строк, соответствующих шаблону (/^$/d).
  2. Вставка (i): добавление текста в поток файла в определённых местах.
  3. Вывод (-n ... p): отключение вывода по умолчанию и вывод только выбранных строк.
  4. Редактирование непосредственно в файле (-i): изменение файла вместо простого вывода результата на экран.

sed — важный инструмент для автоматической обработки текста. Его широко используют в сценариях оболочки для управления конфигурацией и анализа журналов.