Как убрать из отображения пустые и закомментированные строки linux

Обновлено: 08.07.2024

Команда sed - это потоковый редактор текста, работающий по принципу замены. Его можно использовать для поиска, вставки, замены и удаления фрагментов в файле. С помощью этой утилиты вы можете редактировать файлы не открывая их. Будет намного быстрее если вы напишите что и на что надо заменить, чем вы будете открывать редактор vi, искать нужную строку и вручную всё заменять.

В этой статье мы рассмотрим основы использования команды sed linux, её синтаксис, а также синтаксис регулярных выражений, который используется непосредственно для поиска и замены в файлах.

Команда sed в Linux

Сначала рассмотрим синтаксис команды:

$ sed опции -e команды файл

А вот её основные опции:

  • -n, --quiet - не выводить содержимое буфера шаблона в конце каждой итерации;
  • -e - команды, которые надо выполнить для редактирования;
  • -f - прочитать команды редактирования из файла;
  • -i - сделать резервную копию файла перед редактированием;
  • -l - указать свою длину строки;
  • -r - включить поддержку расширенного синтаксиса регулярных выражений;
  • -s - если передано несколько файлов, рассматривать их как отдельные потоки, а не как один длинный.

Я понимаю, что сейчас всё очень сложно, но к концу статьи всё прояснится.

1. Как работает sed

Теперь нужно понять как работает команда sed. У утилиты есть два буфера, это активный буфер шаблона и дополнительный буфер. Оба изначально пусты. Программа выполняет заданные условия для каждой строки в переданном ей файле.

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

Когда всё команды будут выполнены и не указана опция -n, содержимое буфера шаблона выводится в стандартный поток вывода перед этим добавляется обратно символ перевода строки. если он был удален. Затем запускается новая итерация цикла для следующей строки.

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

2. Адреса sed

Каждой команде можно передать адрес, который будет указывать на строки, для которых она будет выполнена:

  • номер - позволяет указать номер строки, в которой надо выполнять команду;
  • первая

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

3. Синтаксис регулярных выражений

Вы можете использовать такие же регулярные выражения, как и для Bash и популярных языков программирования. Вот основные операторы, которые поддерживают регулярные выражения sed Linux:

  • * - любой символ, любое количество;
  • \+ - как звездочка, только один символ или больше;
  • \? - нет или один символ;
  • \ - любой символ в количестве i;
  • \ - любой символ в количестве от i до j;
  • \ - любой символ в количестве от i и больше.

4. Команды sed

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

Утилите можно передать несколько команд, для этого их надо разделить точкой с запятой или использовать две опции -e. Теперь вы знаете всё необходимое и можно переходить к примерам.

Примеры использования sed

Теперь рассмотрим примеры sed Linux, чтобы у вас сложилась целостная картина об этой утилите. Давайте сначала выведем из файла строки с пятой по десятую. Для этого воспользуемся командой -p. Мы используем опцию -n чтобы не выводить содержимое буфера шаблона на каждой итерации, а выводим только то, что нам надо. Если команда одна, то опцию -e можно опустить и писать без неё:

sed -n '5,10p' /etc/group

Или можно вывести весь файл, кроме строк с первой по двадцатую:

sed '1,20d' /etc/group

Здесь наоборот, опцию -n не указываем, чтобы выводилось всё, а с помощью команды d очищаем ненужное. Дальше рассмотрим замену в sed. Это самая частая функция, которая применяется вместе с этой утилитой. Заменим вхождения слова root на losst в том же файле и выведем всё в стандартный вывод:

sed 's/root/losst/g' /etc/group

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

sed '1,10 s/0/1000/g' /etc/group

Переходим ещё ближе к регулярным выражениям, удалим все пустые строки или строки с комментариями из конфига Apache:

sed 's/[$p*]/losst_p/g' /etc/group

Если вам надо записать результат замены в обратно в файл можно использовать стандартный оператор перенаправления вывода > или утилиту tee. Например:

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

Если надо сохранить оригинальный файл, достаточно передать опции -i в параметре расширение для файла резервной копии.

Выводы

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

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Оцените статью:

(14 оценок, среднее: 2,64 из 5)

Об авторе

11 комментариев

Да. Было время, когда и я тоже пользовался sed-ом. Причём несколько раз.
Но потом понял -- мне проще и быстрее выполнять редактирование текста в обычном редакторе.

Если работа происходит в графической консоли (у меня Debian, MATE), то проще запустить текстовый редактор pluma. Если же нужно выполнить редактирование удалённого файла (в смысле на другом компе), то это проще сделать с помощью nano или mcedit (из пакета mc). На крайняк скопировать удалённый файл к себе на комп, изменить и вернуть обратно. Но использовать sed-ом -- 🙁 . смысл этого я что-то не очень понимаю. На минутчку! За последние лет 10 я его так ни разу по делу и не использовал, не было нужды прибегать именно к нему на фоне других редакторов текста.

А никто случаем не заметил диссонанса на скриншотах в статье? С одной стороны -- мощный компьютер с мощным процессором и гигабайтами памяти, современной видеокартой с высоким разрешением и графический рабочий стол. А с другой -- какой-то маленький потоковый редактор, которому для его работы нужно совсем ничтожное количество ресурсов компа. Которому совсем не нужна графика рабочего стола. Который, чтобы правильно запустить в работу и получить результат, которому можно верить, -- нужно ещё вспомнить как это всё делается. Что мы делаем? Какой в этом смысл?

Да, sed -- очень симпатичный и быстрый редактор. Я искренне извиняюсь, но я просто не вижу ему реальных применение. Разве что понастальгировать. Но это из области эмоций, а не технологий. Мир Линукса изменился сильно со времен, когда sed был актуален. Изменились инструменты. Изменился подход к решению задач.

sed - инструмент программиста, наиболее частая область применения - скрипты, используется обычно для автоматизации сложных деплойментов, предполагающих много рутины, чтобы ручками нужные файлы не редактировать, вся рутина выстраивается в сценарий, а потом скрипт просто исполняется на сервере. Желающие использовать его в командной строке, ну чо, пусть поупражняются, всё одно - польза и интеллектуальное развитие организма.

Спасибо!
Несколько далёк от этой области. Тоже программер, но пишу под микроконтроллеры и немного для компов (десктоп-программулины). Админка и вэб -- не моё. Не знал, что там есть применение sed-у.

Занят в embedded разработке под arm, phytec и т.п. Частенько приходилось в загрузочных скриптах или сервисных скриптах задействовать sed для автоматического парсинга логов, конфигурационных параметров системы и т.п. Утилиту sed очень удобно применять, когда входные данные на лету требуется преобразовать к требуемому для последующей переработки виду. Где кроется гемор с регулярными выражениями, так это в случаях, когда требуется автоматическое сервисное обслуживание устройств в сети по ssh. При необходимости передачи вложенных скриптовых выражений, которые частично должны интерпретироваться как чистый текст с необходимостью использования символов экранирования, а частично как команды подстановки. У меня бывали случаи, когда использование одного экранирующего символа "\" в исходном выражении могло приводить к преобразованию его к "\\\" для передачи выражения по ssh, в отдельных случаях неявное поведение баша вообще не позволяло сделать корректное эквивалентное преобразование команд для передачи по ssh. Честно говоря, регулярные выражения мне нравятся ровно до тех пор, пока из них не требуется сформировать более менее сложную команду. Это чуть ли не единственная для шелла вещь из области "Использовал при написании в скрипте, а потом через пол-года не можешь вспомнить, что эта мешанина из спец. и экранирующих символов может значить" XD

Ага. И Вам тоже спасибо!
Я задам, возможно, глупый вопрос -- а файлы, о которых Вы говорите -- загрузочные скрипты, логи и так далее -- они какие по размеру? Сколько строк или килобайт в среднем? Я просто не очень себе представляю.

Ну и мой глупый вопрос -- а почему с этими файлами лучше работать с помощью sed, а не обрабатывать их в Perl или Python?

Я совершенно не представляю специфики, поэтому могу спросить что-то не то. Извиняйте, если что.

Ещё один пример, есть резервная копия базы данных размером в 1 Гб, надо заменить все запросы INSERT на INSERT IGNORE.

Сегодня пришлось заняться: пользователь удалил несколько писем из архива за 2019 год почты Mozilla Thunderbird. Их надо восстановить. В "Удаленные" это письма, почему-то, не попали. Фактически письма всё ещё находятся в файле 2019 размером 9 Гб.
Задача: заменить все строки X-Mozilla-Status: 0009 на X-Mozilla-Status: 0001. mcedit даже на открытии такого файла уже "присел".
И вот решение: sed -i 's/X-Mozilla-Status:\ 0009/X-Mozilla-Status:\ 00091/g' 2019. Пара минут и все удалённые письма восстановлены.

Извините, ошибся: sed -i 's/X-Mozilla-Status:\ 0009/X-Mozilla-Status:\ 0001/g' 2019

Я просто хочу напечатать весь некомментированный код:

Возможность извлечения комментариев из файла очень важна . Какой хороший способ сделать это?

Вы не можете удалить части строки с помощью grep. Вы можете использовать Sed для этого Ваш текст и ваш пример противоречат. Вы пишете о закомментированных строках, но ясно, что из последней строки вы имеете в виду части строк. Затем удаляется первая строка с комментарием, включая EOL, а вторая может быть, но неясно, так как это последняя строка. Пожалуйста, перефразируйте «закомментированные строки», чтобы быть точным, и устраните неоднозначность ваших примеров. @Questionmark Я мог бы быть умным, но я не умный пишущий-грамматик-парсер.

Один из способов , чтобы удалить все комментарии заключается в использовании grep с -o опцией:

Обратите внимание, что пустые строки тоже будут удалены, но останутся только строки с пробелами.

Комментарии исчезли, но я вижу кучу пробелов на их месте в выводе? sed Решение имеет только одну пустую строку, кажется твердым аргументом для использования другого ответа, если я что-то упустил? @JBallin Ты определил псевдоним для, grep может быть? Попробуйте изменить grep на command grep , если вы все еще видите пробелы после примера ввода.

Я верю, что sed справится с этим гораздо лучше, чем grep . Что-то вроде этого:

объяснение

@javadba, да, но в этот момент вы могли бы также использовать полный анализатор. Что будут использовать эти данные, которые могут понимать кавычки и назначения переменных, но не могут обрабатывать комментарии? (Вот почему многие файлы конфигурации, такие как crontab разрешают только полнострочные комментарии с пробелом или без него, но не допускают конечные комментарии в строке. Логика НАМНОГО проще. Используйте только первую из двух инструкций Sed в этом ответе для зачистки комментариев crontab.)

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

Здесь нам нужно удалить эти строки, чтобы мы заменили их пустыми, пропустив часть «замена».

  • g упоминание повторного поиска шаблона, пока не будет достигнут конец файла.

Общий синтаксис sed: s/regexp/replacement/flags FileName

примечание: в этом случае 4-я строка заменяется новой. Попробуйте это с помощью сценария, содержащего эту sed команду .

Я написал средство форматирования оболочки под названием shfmt , в котором есть функция минимизации кода. Это включает в себя удаление комментариев, среди прочего:

Синтаксический анализатор и принтер являются пакетами Go, поэтому, если вам нужно нестандартное решение, довольно легко написать программу Go из 20 строк, которая удалит комментарии именно тем способом, который вам нужен.

Вы можете использовать обратное совпадение следующим образом:

-v, --invert-match Инвертировать смысл соответствия, чтобы выбрать несовпадающие строки. (-v определяется POSIX.)

tr утилита командной строки в системах Linux и Unix, которая переводит, удаляет и сжимает символы из стандартного ввода и записывает результат в стандартный вывод.

Команда tr может выполнять такие операции, как удаление повторяющихся символов, преобразование прописных букв в строчные, а также замена и удаление основных символов. Как правило, он используется в сочетании с другими командами через трубопровод.


Как использовать tr команду

Синтаксис tr команды следующий:

tr принимает два набора символов, обычно одинаковой длины, и заменяет символы первого набора соответствующими символами из второго набора.

A SET - это в основном строка символов, включая специальные символы с обратной косой чертой.

В следующем примере tr будут заменены все символы из стандартного ввода (baksdev) путем сопоставления символов из первого набора с совпадающими символами из второго набора.


Каждое вхождение l заменяется на r , i с e и n на d :


Наборы символов также могут быть определены с использованием диапазонов символов. Например, вместо того, чтобы писать:


ты можешь использовать:


При использовании опции -c ( --complement ) tr заменяются все символы, которых нет в SET1.

В приведенном ниже примере все символы, кроме «li», будут заменены последними символами из второго набора:


Как вы могли заметить, вышеприведенный вывод имеет еще один видимый символ, чем ввод. Это связано с тем, что echo команда печатает невидимый символ новой строки, \n который также заменяется на y . Чтобы отобразить строку без новой строки, используйте -n параметр.

Опция -d ( --delete ) указывает tr на удаление символов, указанных в SET1. При удалении символов без сжатия указывайте только один набор.

Приведенная ниже команда удалит l , i и z символы:


Символ L не удаляется, потому что ввод включает в себя заглавные буквы, в L то время как l символы в наборе строчные.


Опция -s ( --squeeze-repeats ) заменяет последовательность повторяющихся вхождений набором символов в последнем SET.

В следующем примере tr удаляются повторяющиеся пробелы:


Когда используется SET2, последовательность символов, указанная в SET1, заменяется на SET2.


Опция -t ( --truncate-set1 ) вынуждает tr обрезать SET1 до длины SET2 перед дальнейшей обработкой.

По умолчанию, если SET1 больше, чем SET2, tr будет повторно использоваться последний символ SET2. Вот пример:


Вывод показывает, что символ e из SET1 соответствует самому последнему символу из SET2, а именно 2 :


Теперь используйте ту же команду с -t опцией:


Вы можете видеть, что последние три символа SET1 удалены. SET1 становится 'ab', такой же длины, как SET2, и замена не производится.

Объединение вариантов

Команда tr также позволяет комбинировать ее параметры. Например, следующая команда первого заменяет все символы , кроме i с , 0 а затем сжимает повторяющиеся 0 символы:


Примеры команд Tr

В этом разделе мы рассмотрим несколько примеров общего использования tr команды.

Преобразовать нижний регистр в верхний регистр

Преобразование нижнего регистра в верхний или обратный является одним из типичных вариантов использования tr команды. [:lower:] соответствует всем символам в нижнем регистре и [:upper:] соответствует всем символам в верхнем регистре.


Вместо классов персонажей вы также можете использовать диапазоны:


Чтобы преобразовать верхний регистр в нижний регистр, просто поменяйте местами наборы.

Удалить все нечисловые символы

Следующая команда удаляет все нечисловые символы:


[:digit:] обозначает все цифры, и, используя -c опцию, команда удаляет все не цифры. Вывод будет выглядеть так:


Поместите каждое слово в новую строку

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


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

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

В команде выше мы используем символ перенаправления < передать содержание file.txt в tr команде. Перенаправление > записывает вывод команды в new_file.txt .


Печать $PATH каталогов на отдельной строке

$PATH Переменная окружающей среды является двоеточиями список каталогов, сообщает оболочке , какие каталоги для поиска исполняемых файлов при вводе команды.

Чтобы напечатать каждый каталог в отдельной строке, нам нужно сопоставить двоеточие ( : ) и заменить его новой строкой:


Вывод

tr - команда для перевода или удаления символов

Хотя очень полезно, tr может работать только с одиночными символами. Для более сложного сопоставления с образцом и работы со строками, вы должны использовать sed или awk .

Команда sed - это потоковый редактор текста, работающий по принципу замены. Его можно использовать для поиска, вставки, замены и удаления фрагментов в файле. С помощью этой утилиты вы можете редактировать файлы не открывая их. Будет намного быстрее если вы напишите что и на что надо заменить, чем вы будете открывать редактор vi, искать нужную строку и вручную всё заменять.

В этой статье мы рассмотрим основы использования команды sed linux, её синтаксис, а также синтаксис регулярных выражений, который используется непосредственно для поиска и замены в файлах.

Команда sed в Linux

Сначала рассмотрим синтаксис команды:

$ sed опции -e команды файл

А вот её основные опции:

  • -n, --quiet - не выводить содержимое буфера шаблона в конце каждой итерации;
  • -e - команды, которые надо выполнить для редактирования;
  • -f - прочитать команды редактирования из файла;
  • -i - сделать резервную копию файла перед редактированием;
  • -l - указать свою длину строки;
  • -r - включить поддержку расширенного синтаксиса регулярных выражений;
  • -s - если передано несколько файлов, рассматривать их как отдельные потоки, а не как один длинный.

Я понимаю, что сейчас всё очень сложно, но к концу статьи всё прояснится.

1. Как работает sed

Теперь нужно понять как работает команда sed. У утилиты есть два буфера, это активный буфер шаблона и дополнительный буфер. Оба изначально пусты. Программа выполняет заданные условия для каждой строки в переданном ей файле.

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

Когда всё команды будут выполнены и не указана опция -n, содержимое буфера шаблона выводится в стандартный поток вывода перед этим добавляется обратно символ перевода строки. если он был удален. Затем запускается новая итерация цикла для следующей строки.

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

2. Адреса sed

Каждой команде можно передать адрес, который будет указывать на строки, для которых она будет выполнена:

  • номер - позволяет указать номер строки, в которой надо выполнять команду;
  • первая

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

3. Синтаксис регулярных выражений

Вы можете использовать такие же регулярные выражения, как и для Bash и популярных языков программирования. Вот основные операторы, которые поддерживают регулярные выражения sed Linux:

  • * - любой символ, любое количество;
  • \+ - как звездочка, только один символ или больше;
  • \? - нет или один символ;
  • \ - любой символ в количестве i;
  • \ - любой символ в количестве от i до j;
  • \ - любой символ в количестве от i и больше.

4. Команды sed

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

Утилите можно передать несколько команд, для этого их надо разделить точкой с запятой или использовать две опции -e. Теперь вы знаете всё необходимое и можно переходить к примерам.

Примеры использования sed

Теперь рассмотрим примеры sed Linux, чтобы у вас сложилась целостная картина об этой утилите. Давайте сначала выведем из файла строки с пятой по десятую. Для этого воспользуемся командой -p. Мы используем опцию -n чтобы не выводить содержимое буфера шаблона на каждой итерации, а выводим только то, что нам надо. Если команда одна, то опцию -e можно опустить и писать без неё:

sed -n '5,10p' /etc/group

Или можно вывести весь файл, кроме строк с первой по двадцатую:

sed '1,20d' /etc/group

Здесь наоборот, опцию -n не указываем, чтобы выводилось всё, а с помощью команды d очищаем ненужное. Дальше рассмотрим замену в sed. Это самая частая функция, которая применяется вместе с этой утилитой. Заменим вхождения слова root на losst в том же файле и выведем всё в стандартный вывод:

sed 's/root/losst/g' /etc/group

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

sed '1,10 s/0/1000/g' /etc/group

Переходим ещё ближе к регулярным выражениям, удалим все пустые строки или строки с комментариями из конфига Apache:

sed 's/[$p*]/losst_p/g' /etc/group

Если вам надо записать результат замены в обратно в файл можно использовать стандартный оператор перенаправления вывода > или утилиту tee. Например:

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

Если надо сохранить оригинальный файл, достаточно передать опции -i в параметре расширение для файла резервной копии.

Выводы

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

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Оцените статью:

(14 оценок, среднее: 2,64 из 5)

Об авторе

11 комментариев

Да. Было время, когда и я тоже пользовался sed-ом. Причём несколько раз.
Но потом понял -- мне проще и быстрее выполнять редактирование текста в обычном редакторе.

Если работа происходит в графической консоли (у меня Debian, MATE), то проще запустить текстовый редактор pluma. Если же нужно выполнить редактирование удалённого файла (в смысле на другом компе), то это проще сделать с помощью nano или mcedit (из пакета mc). На крайняк скопировать удалённый файл к себе на комп, изменить и вернуть обратно. Но использовать sed-ом -- 🙁 . смысл этого я что-то не очень понимаю. На минутчку! За последние лет 10 я его так ни разу по делу и не использовал, не было нужды прибегать именно к нему на фоне других редакторов текста.

А никто случаем не заметил диссонанса на скриншотах в статье? С одной стороны -- мощный компьютер с мощным процессором и гигабайтами памяти, современной видеокартой с высоким разрешением и графический рабочий стол. А с другой -- какой-то маленький потоковый редактор, которому для его работы нужно совсем ничтожное количество ресурсов компа. Которому совсем не нужна графика рабочего стола. Который, чтобы правильно запустить в работу и получить результат, которому можно верить, -- нужно ещё вспомнить как это всё делается. Что мы делаем? Какой в этом смысл?

Да, sed -- очень симпатичный и быстрый редактор. Я искренне извиняюсь, но я просто не вижу ему реальных применение. Разве что понастальгировать. Но это из области эмоций, а не технологий. Мир Линукса изменился сильно со времен, когда sed был актуален. Изменились инструменты. Изменился подход к решению задач.

sed - инструмент программиста, наиболее частая область применения - скрипты, используется обычно для автоматизации сложных деплойментов, предполагающих много рутины, чтобы ручками нужные файлы не редактировать, вся рутина выстраивается в сценарий, а потом скрипт просто исполняется на сервере. Желающие использовать его в командной строке, ну чо, пусть поупражняются, всё одно - польза и интеллектуальное развитие организма.

Спасибо!
Несколько далёк от этой области. Тоже программер, но пишу под микроконтроллеры и немного для компов (десктоп-программулины). Админка и вэб -- не моё. Не знал, что там есть применение sed-у.

Занят в embedded разработке под arm, phytec и т.п. Частенько приходилось в загрузочных скриптах или сервисных скриптах задействовать sed для автоматического парсинга логов, конфигурационных параметров системы и т.п. Утилиту sed очень удобно применять, когда входные данные на лету требуется преобразовать к требуемому для последующей переработки виду. Где кроется гемор с регулярными выражениями, так это в случаях, когда требуется автоматическое сервисное обслуживание устройств в сети по ssh. При необходимости передачи вложенных скриптовых выражений, которые частично должны интерпретироваться как чистый текст с необходимостью использования символов экранирования, а частично как команды подстановки. У меня бывали случаи, когда использование одного экранирующего символа "\" в исходном выражении могло приводить к преобразованию его к "\\\" для передачи выражения по ssh, в отдельных случаях неявное поведение баша вообще не позволяло сделать корректное эквивалентное преобразование команд для передачи по ssh. Честно говоря, регулярные выражения мне нравятся ровно до тех пор, пока из них не требуется сформировать более менее сложную команду. Это чуть ли не единственная для шелла вещь из области "Использовал при написании в скрипте, а потом через пол-года не можешь вспомнить, что эта мешанина из спец. и экранирующих символов может значить" XD

Ага. И Вам тоже спасибо!
Я задам, возможно, глупый вопрос -- а файлы, о которых Вы говорите -- загрузочные скрипты, логи и так далее -- они какие по размеру? Сколько строк или килобайт в среднем? Я просто не очень себе представляю.

Ну и мой глупый вопрос -- а почему с этими файлами лучше работать с помощью sed, а не обрабатывать их в Perl или Python?

Я совершенно не представляю специфики, поэтому могу спросить что-то не то. Извиняйте, если что.

Ещё один пример, есть резервная копия базы данных размером в 1 Гб, надо заменить все запросы INSERT на INSERT IGNORE.

Сегодня пришлось заняться: пользователь удалил несколько писем из архива за 2019 год почты Mozilla Thunderbird. Их надо восстановить. В "Удаленные" это письма, почему-то, не попали. Фактически письма всё ещё находятся в файле 2019 размером 9 Гб.
Задача: заменить все строки X-Mozilla-Status: 0009 на X-Mozilla-Status: 0001. mcedit даже на открытии такого файла уже "присел".
И вот решение: sed -i 's/X-Mozilla-Status:\ 0009/X-Mozilla-Status:\ 00091/g' 2019. Пара минут и все удалённые письма восстановлены.

Извините, ошибся: sed -i 's/X-Mozilla-Status:\ 0009/X-Mozilla-Status:\ 0001/g' 2019

Читайте также: