Linux sed удалить пробелы

Обновлено: 02.07.2024

Команда sed в Linux

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

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

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

Установка

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

Концепции

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

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

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

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

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

Адреса sed

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

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

Синтаксис

Синтаксис данной утилиты не отличается сложностью. Он представлен в виде:

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

sed -e [команды] (файл)

Первоначально кажется, что данная утилита очень сложная. На самом деле это не так, ей сможет пользоваться даже новичок в сфере программирования.

Стоит отметить, что данная утилита имеет два отдельно обособленных буфера – это основной и вспомогательный буфер (активного и пассивного плана). Первоначально они абсолютно пусты. Специальная программа передает предварительно определенные условия для всех строк передаваемого файла.

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

Далее выполняются команды, которые были переданы пользователем в параметрах. За каждой определенной командой закрепляется адрес. Он используется в качестве своеобразного условия. Команда пройдет лишь в том случае, если данное условие будет соблюдено.

После выполнения всех предписанных команд, содержимое буфера шаблона попадает в классический поток вывода. Это происходит в том случае, если предварительно не была указана функция «-n», которая ограничивает вывод содержимого.

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

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

Особенности адресов, предающихся утилите «sed»

Все команды получают свой адрес. Именно он указывает на строки, для которых выполняется команда:

  • «номер». В данном случае прописывается номер определенной строки, где в последующем будет выполняться команда.
  • «первая

Когда пользователь не желает задавать определенный адрес для программы «sed», она распространяется на все строки в файле. Если передается один адрес, команда выполняется до той строки, которая расположена по указанному адресу.

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

Использование специальных символов:

Полный набор не ограничен только этими тремя. Sed прекрасно понимает регулярные выражения (regular expressions).

Следующая команда заменит root на Admin в тех строках, которые начинаются с user:

Следующая команда заменит root на Admin в тех строках, которые заканчиваются словом data:

С помощью следующей конструкции слово root с пробелом после него будет заменено на Admin с двоеточием:

В случае использования символа (pipe) в качестве разделителя спецсимволы экранировать не нужно, но при этом регулярные выражения работать не будут

Регулярные выражения

Убрать все цыфры из вывода:

Продублировать отсеченное значение:

Регулярное выражение 4* определят 0 или больше цыфр.
Регулярное выражение 78* определят 1 или больше цыфр.

Пробел в левой части выражения может быть заменен на любой другой разделитель.

Замена текства между двумя словами:

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

При написании bash скриптов мы используем переменные. Иногда возникает необходимость использовать эти переменные в выражениях sed.

Основные команды Sed

Для того чтобы применить SED достаточно ввести в командную строку

echo ice | sed s/ice/fire/

Замена слова в файле

Обычно SED применяют к файлам, например к логам или конфигам.
Предположим, что у нас есть файл input.txt следующего содержания

Here is a StringHere is an IntegerHere is a Float

Мы хотим заменить слово Here на There

Результат будет выведен в консоль:

There is a String
There is an Integer
There is a Float

В этом случае перепишется исходный файл input.txt

Рассмотрим пример посложнее. Файл input.txt теперь выглядит так:

Here is an Apple. Here is a Pen. Here is an ApplePenInteger is HereHere is a FloatHere is a Pen. Here is a Pineapple. Here is a PineapplePen

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

There is an Apple. Here is a Pen. Here is an ApplePen
Integer is There
There is a Float
There is a Pen. Here is a Pineapple. Here is a PineapplePen

Чтобы заменить все слова нужна опция g

There is an Apple. There is a Pen. There is an ApplePen
Integer is There
There is a Float
There is a Pen. There is a Pineapple. There is a PineapplePen

Замена слова в файле и вывод результата в другой файл

Та же замена, но с выводом в новый текстовый файл, который мы назовём output:

Замена слова в нескольких файлах одновременно

Если нужно обработать сразу несколько файлов: например файл 1.txt с содержанием

First File: Here

И файл 2.txt с содержанием

Second File: Here

Это можно сделать используя *.txt

На выходе файл output.txt будет выглядеть так

First File: ThereSecond File: There

Отбросить всё, что левее определённого слова

Предположим, что у нас есть файл input.txt следующего содержания

Here is a String it has a NameHere is an Integer it has a NameHere is a Float it has a Name

Мы хотим отбросить всё, что находится левее слова it, включая слово it, и записать в файл.

^ означает, что мы стартуем с начала строки Результат:

has a Name
has a Name
has a Name

Для доступности объясню синтаксис сравнив две команды. Посмотрите внимательно, когда мы заменяем слово Here на There.
There находится между двумя слэшами. Раскрашу их для наглядности в зелёный и красный.

А когда мы хотим удалить что-то, мы сначала описываем, что мы хотим удалить. Например, всё от начала строки до слова it.
Теперь в правой части условия, где раньше была величина на замену, мы ничего не пишем, т.е. заменяем на пустое место. Надеюсь, логика понятна.

Отбросить всё, что правее определённого слова

Предположим, что у нас есть файл input.txt следующего содержания

Here is a String / it has a NameHere is an Integer / it has a NameHere is a Float / it has a Name

Мы хотим отбросить всё, что находится правее слова is, включая слово is, и записать в файл.

Экранирование символов в sed

Специальные символы экранируются с помощью
Предположим, что у нас есть файл input.txt следующего содержания

Here is a String / it has a NameHere is an Integer / it has a NameHere is a Float it / has a Name

Мы хотим отбросить всё, что находится левее /a, включая /a, и записать в файл.

В результате получим ошибку

Чтобы команда заработала нужно добавить перед /

Here is a StringHere is an IntegerHere is a Float

Два условия одновременно в Sed

Предположим, что у нас есть файл input.txt следующего содержания

Here is a String /b it has a NameHere is an Integer /b it has a NameHere is a Float /b it has a Name

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

Удалить всё после определённой строки

Допустим Вы хотите удалить все строки после третьей

sed 3q input.txt > output.txt

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

Можно легко удалить текст, который мы выводили в предыдущем примере, заменив команду “p” на команду “d”. Команда «-n» нам больше не нужна, потому что при использовании команды удаления утилита выводит все, что не удалено. Это позволяет нам видеть, что происходит. Изменим последнюю команду из предыдущего раздела так, чтобы она удаляла все нечетные строки, начиная с первой. В результате мы должны получить все строки, которые не были выведены в прошлый раз.

Открыв этот файл командой cat, мы увидим тот же результат, который был на экране после выполнения предыдущей команды. По умолчанию sed не редактирует исходный файл в целях безопасности. Это можно изменить при помощи опции «-i», которая означает редактирование на месте. Исходный файл будет изменен. Давайте попробуем отредактировать только что созданный нами файл «everyother.txt». Снова удалим все нечетные строки:

При помощи cat можно убедиться, что файл был отредактирован.

Опция “-i” может быть опасной, но утилита предоставляет возможность создания резервной копии перед редактированием. Для этого сразу после опции “-i” укажите расширение резервной копии “.bak”:

Будет создан файл резервной копии с расширением “bak”, а затем выполнено редактирование исходного файла.

Замена текста

Чаще всего sed используется для замены текста. Редактор позволяет осуществлять поиск текста по шаблону при помощи регулярных выражений. А затем заменять найденный текст. В простейшем варианте можно заменить одно слово на другое, используя следующий синтаксис:

Параметр «s» – это команда замены. Три слэша (/) нужны для разделения различных текстовых полей. Если вам удобно, вы можете использовать для этого другие символы. Например, если нам нужно изменить имя веб-сайта, удобнее использовать другой разделитель, так как URL содержат слэши. Воспользуемся командой echo для передачи примера:

Здесь секция «com/index» заменяется на «org/home». В качестве разделителя используется нижнее подчеркивание «_». Не забудьте про последний разделитель, иначе sed выдаст ошибку.

Создадим файл для отработки замен:

Теперь заменим «on» на «forward»

Стоит обратить внимание на ряд моментов. Во-первых, мы заменяем шаблоны, а не слова. “on” в слове “song” было заменено на “forward”. Во-вторых, второе “on” в строке 2 заменено не было. Это произошло потому, что по умолчанию команда “s” обрабатывает первое совпадение в строке. А затем переходит к следующей строке. Для замены каждого “on”, а не только первого в строке, можно указать команде замены флаг “g” после шаблонов:

Теперь были заменены все “on”. Чтобы заменить только вторые “on” в каждой строке, вместо “g” нужно указать “2”:

Если нам нужно вывести только те строки, где выполнялась замена, для отмены автоматического вывода можно снова воспользоваться опцией «-n». Затем мы можем передать флаг “p” для вывода строк, в которых производились замены.

Пример показывает, что флаги в конце команды можно комбинировать. Чтобы игнорировать регистр, нужно указать флаг “i”.

Если нужно заменить текст во всех файлах директории то можно воспользоваться командой

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

В окружении UNIX: конвертируем новые строки DOS (CR/LF) в формат Unix.

Предполагаем, что все строки оканчиваются на CR/LF

В bash/tcsh, нажмите Ctrl-V затем Ctrl-M

Работает на ssed, gsed 3.02.80 или выше

В окружении UNIX: конвертируем новые строки Unix (LF) в формат DOS.

Командная строка под ksh

Командная строка под bash

Командная строка под zsh

gsed 3.02.80 или выше

В окружении DOS: конвертируем новые строки Unix (LF) в формат DOS.

В окружении DOS: конвертировать DOS переводы строк (CR/LF) в формат Unix.

Может быть только сделано с UnxUtils sed, версии 4.0.7 или выше. Версию UnxUtils можно узнать пользовательским свичем “–text”, который появляется когда вы используете свич “–help”. В других случаях изменение перевода строк DOS в перевод строк Unix не может быть выполнено в окружении DOS. Используйте вместо этого “tr”.

UnxUtils sed v4.0.7 или выше

GNU tr версия 1.22 или выше

Удалить пустоту в начале (пробелы, табуляции) от передней части каждой строки выравнивает весь текст по левому краю

Удаление пустоты (пробелы, табуляции) в конце каждой строки

Удаление пустоты как в начале, так и в конце каждой строки

Вставка 5 пробелов в начале каждой строки (сделать отступ страницы)

Выравнять весь текст заподлицо справа на 79-ом столбце по ширине

Центрировать весь текст в середине на 79-ом столбце по ширине

В первом методе пробелы в начале строки имеют значение, и в конце строки добавляются пробелы.

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

Подстановка (поиск и замена “foo” на “bar” в каждой строке

Заменить только первое вхождение в строке

Заменить только четвёртое вхождение в строке

Заменить ВСЕ вхождения в строке

Заменяет следующее-на-последнее вхождение (the next-to-last case)

Поменять только последний случай

Поменять “foo” на “bar” ТОЛЬКО для строк, которые содержат “baz”

Заменить “foo” на “bar” КРОМЕ строк, которые содержат “baz”

Поменять “scarlet” или “ruby” или “puce” на “red”

Обратный порядок строк (эмулирует “tac”) баг/фича в HHsed v1.5 приводит к тому, что пустые строки удаляются

Обратный порядок всех символов в строке (эмулирует “rev”)

Соединить пары строк (наподобие “paste”)

Если строка заканчивается на обратный слэш, прикрепить к ней следующую строку

Если строка начинается со знака равно, прикрепить её к предыдущей строке и заменить “=” на пробел

Добавить запятые в цифровую строку, замена “1234567” на “1,234,567”

Добавить запятые к номерам, в том числе содержащим десятичные точки и знаки минус (GNU sed)

Добавить пустую строку каждые 5 строк (после каждых 5, 10, 15, 20 и т. д. строк)

Выборочная печать конкретных строк:

Напечатать первые 10 строк файла (эмулирует поведение “head”)

Напечатать первую строку файла (эмулирует “head -1″)

Напечатать последние 10 строк файла (эмулирует “tail”)

Напечатать последние 2 строки файла (эмулирует “tail -2″)

Напечатать последнюю строку файла (эмулирует “tail -1″)

Напечатать строки файла начиная с последней

Для файла в одну строку напечатать пустую строку

Для файла в одну строку, напечатать эту строку:

Для файла в одну строку ничего не печатать

Печатать только строки, которые соответствуют регулярному выражению (эмулирует “grep”)

Печатать только строки, которые НЕ соответствуют регулярному выражению (эмулирует “grep -v”)

Метод 1, соответствует вышеприведённому

Метод 2, упрощённый синтаксис

Печатать строку, которая идёт перед строкой, удовлетворяющей регулярному выражению, но не строку, содержащую регулярное выражение

Печатать строку, которая идёт сразу после регулярного выражения, но не строку, содержащую регулярное выражение

Печатать по одной строке перед и после регулярного выражения, с номером строки, показывающей где встретилось регулярное выражение (наподобии “grep -A1 -B1″)

grep для AAA и BBB и CCC (в любом порядке)

grep для AAA и BBB и CCC (в таком порядке)

grep для AAA или BBB или CCC (эмулирует “egrep”)

Напечатать параграф, если он содержит AAA (параграфы разделяют пустые строки) HHsed v1.5 должен вставить ‘G;’ после ‘x;’ в следующих трёх скриптах ниже

Напечатать параграф, если он содержит AAA и BBB и CCC (в любом порядке)

Напечатать параграф, если он содержит AAA или BBB или CCC

Напечатать только строки длинной 65 символов или длиннее

Напечатать только строки, которые короче 65 символов

Метод 1, соответствует вышеприведённому

Метод 2, упрощённый синтаксис

Напечатать секцию файла от регулярного выражения до конца файла

Напечатать строку с номером 52

Способ 3, эффективен на больших файлах

Начиная со строки 3, печатать каждую седьмую строку

Напечатать раздел файла между двумя регулярными выражениями (включая)

Выборочное удаление конкретных строк:

Напечатать весь файл КРОМЕ секции между двумя регулярными выражениями 2

Удалить дубликаты последовательных строк файла (эмулирует “uniq”). Первая строка из двух дублирующих сохраняется, остальное удаляется.

Удалить дубликаты непоследовательных строк из файла. Остерегайтесь переполнения буфера или используйте GNU sed.

Удалить все строки, кроме дублирующих строк (эмулирует “uniq -d”).

Удалить первые 10 строк файла

Удалить последние строки файла

Удалить последние 2 строки файла

Удалить последние 10 строк файла

Удалить каждую восьмую строку файла

Удалить строки, содержащие паттерн

Удалить ВСЕ пустые строки из файла (то же самое что и “grep ‘.’ “)

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла, кроме первой, также удаляет все пустые строки в начале и в конце файла (эмулирует “cat -s”)

Способ 1, позволяет 0 пустых строк вверху, 1 в EOF

Способ 2, позволяет 1 пустую строку вверху, 0 в EOF

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла кроме первых двух:

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

Удалить все конечные пустые строки в файле

Удалить последнюю строку каждого параграфа

Заключение

Мы рассмотрели основы использования sed. Теперь вы можете быстро редактировать текстовые документы при помощи соответствующих команд sed.

Полезные однострочные скрипты для sed (потокового редактора Unix), составленные Эриком Пементом

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

Sed — это первичный потоковый редактор.

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

Sed редактирует построчно и в неинтерактивном режиме.

Переводы строк в файле:

Удвоение перевода строк:

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

Утроение перевода строк

Отмена удвоения строк (предполагается, что чётные строки всегда пустые)

Вставить пустую строку над каждой строкой, которая соответствует “regex”

Вставить пустую строку под каждой строкой, которая соответствует “regex”

Вставить пустую строку над и под каждой строкой, которая соответствует “regex”

Нумерация:

Пронумеровать каждою строку в файле (просто в левой стороне будут цифры). Использование отступа вместо пробела сохраняет ровное начало строк.

Пронумеровать каждую строку в файле (номера слева, выравнивание по правому краю)

Пронумеровать каждую строку файла, но печатать номер только если строка не пустая

Посчитать строки (эмулирует “wc -l”)

Преобразования текста и подстановки:

В окружении UNIX: конвертируем новые строки DOS (CR/LF) в формат Unix.

Предполагаем, что все строки оканчиваются на CR/LF

В bash/tcsh, нажмите Ctrl-V затем Ctrl-M

Работает на ssed, gsed 3.02.80 или выше

В окружении UNIX: конвертируем новые строки Unix (LF) в формат DOS.

Командная строка под ksh

Командная строка под bash

Командная строка под zsh

gsed 3.02.80 или выше

В окружении DOS: конвертируем новые строки Unix (LF) в формат DOS.

В окружении DOS: конвертировать DOS переводы строк (CR/LF) в формат Unix.

Может быть только сделано с UnxUtils sed, версии 4.0.7 или выше. Версию UnxUtils можно узнать пользовательским свичем “–text”, который появляется когда вы используете свич “–help”. В других случаях изменение перевода строк DOS в перевод строк Unix не может быть выполнено в окружении DOS. Используйте вместо этого “tr”.

UnxUtils sed v4.0.7 или выше

GNU tr версия 1.22 или выше

Удалить пустоту в начале (пробелы, табуляции) от передней части каждой строки выравнивает весь текст по левому краю

Удаление пустоты (пробелы, табуляции) в конце каждой строки

Удаление пустоты как в начале, так и в конце каждой строки

Вставка 5 пробелов в начале каждой строки (сделать отступ страницы)

Выравнять весь текст заподлицо справа на 79-ом столбце по ширине

Центрировать весь текст в середине на 79-ом столбце по ширине

В первом методе пробелы в начале строки имеют значение, и в конце строки добавляются пробелы.

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

Подстановка (поиск и замена “foo” на “bar” в каждой строке

Заменить только первое вхождение в строке

Заменить только четвёртое вхождение в строке

Заменить ВСЕ вхождения в строке

Заменяет следующее-на-последнее вхождение (the next-to-last case)

Поменять только последний случай

Поменять “foo” на “bar” ТОЛЬКО для строк, которые содержат “baz”

Заменить “foo” на “bar” КРОМЕ строк, которые содержат “baz”

Обратный порядок строк (эмулирует “tac”) баг/фича в HHsed v1.5 приводит к тому, что пустые строки удаляются

Обратный порядок всех символов в строке (эмулирует “rev”)

Соединить пары строк (наподобие “paste”)

Если строка заканчивается на обратный слэш, прикрепить к ней следующую строку

Если строка начинается со знака равно, прикрепить её к предыдущей строке и заменить “=” на пробел

Добавить запятые в цифровую строку, замена “1234567” на “1,234,567”

Добавить запятые к номерам, в том числе содержащим десятичные точки и знаки минус (GNU sed)

Добавить пустую строку каждые 5 строк (после каждых 5, 10, 15, 20 и т. д. строк)

Выборочная печать конкретных строк:

Напечатать первые 10 строк файла (эмулирует поведение “head”)

Напечатать первую строку файла (эмулирует “head -1″)

Напечатать последние 10 строк файла (эмулирует “tail”)

Напечатать последние 2 строки файла (эмулирует “tail -2″)

Напечатать последнюю строку файла (эмулирует “tail -1″)

Напечатать строки файла начиная с последней

Для файла в одну строку напечатать пустую строку

Для файла в одну строку, напечатать эту строку:

Для файла в одну строку ничего не печатать

Печатать только строки, которые соответствуют регулярному выражению (эмулирует “grep”)

Печатать только строки, которые НЕ соответствуют регулярному выражению (эмулирует “grep -v”)

Метод 1, соответствует вышеприведённому

Метод 2, упрощённый синтаксис

Печатать строку, которая идёт перед строкой, удовлетворяющей регулярному выражению, но не строку, содержащую регулярное выражение

Печатать строку, которая идёт сразу после регулярного выражения, но не строку, содержащую регулярное выражение

Печатать по одной строке перед и после регулярного выражения, с номером строки, показывающей где встретилось регулярное выражение (наподобии “grep -A1 -B1″)

grep для AAA и BBB и CCC (в любом порядке)

grep для AAA и BBB и CCC (в таком порядке)

grep для AAA или BBB или CCC (эмулирует “egrep”)

Напечатать параграф, если он содержит AAA (параграфы разделяют пустые строки) HHsed v1.5 должен вставить ‘G;’ после ‘x;’ в следующих трёх скриптах ниже

Напечатать параграф, если он содержит AAA и BBB и CCC (в любом порядке)

Напечатать параграф, если он содержит AAA или BBB или CCC

Напечатать только строки длинной 65 символов или длиннее

Напечатать только строки, которые короче 65 символов

Метод 1, соответствует вышеприведённому

Метод 2, упрощённый синтаксис

Напечатать секцию файла от регулярного выражения до конца файла

Напечатать строку с номером 52

Способ 3, эффективен на больших файлах

Начиная со строки 3, печатать каждую седьмую строку

Напечатать раздел файла между двумя регулярными выражениями (включая)

Выборочное удаление конкретных строк:

Напечатать весь файл КРОМЕ секции между двумя регулярными выражениями 2

Удалить дубликаты последовательных строк файла (эмулирует “uniq”). Первая строка из двух дублирующих сохраняется, остальное удаляется.

Удалить дубликаты непоследовательных строк из файла. Остерегайтесь переполнения буфера или используйте GNU sed.

Удалить все строки, кроме дублирующих строк (эмулирует “uniq -d”).

Удалить первые 10 строк файла

Удалить последние строки файла

Удалить последние 2 строки файла

Удалить последние 10 строк файла

Удалить каждую восьмую строку файла

Удалить строки, содержащие паттерн

Удалить ВСЕ пустые строки из файла (то же самое что и “grep ‘.’ “)

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла, кроме первой, также удаляет все пустые строки в начале и в конце файла (эмулирует “cat -s”)

Способ 1, позволяет 0 пустых строк вверху, 1 в EOF

Способ 2, позволяет 1 пустую строку вверху, 0 в EOF

Удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла кроме первых двух:

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

Удалить все конечные пустые строки в файле

Удалить последнюю строку каждого параграфа

Специальные приложения:

Удалить оверстрайки nroff (char, backspace) из страниц man. Команде ‘echo’ может понадобиться переключатель -e если вы используете Unix System V или шелл bash.

Требуются двойные кавычки для окружения Unix

в bash/tcsh, нажмите Ctrl-V, а затем Ctrl-H

hex выражения для sed 1.5, GNU sed, ssed

Получает Тему из заголовка, но удаляет первоначальное “Subject: ”

Получает обратный адрес отправителя из заголовка

Разбирает поле адрес. Достаёт чистый e-mail адрес из первой строки, которая включает в себя кусок заголовка (смотрите предыдущий скрипт)

Удалить ведущую скобку и пробел для каждой строки (расцитативание)

Удаление большинства HTML тэгов (включая многострочные тэги)

Извлечение нескольких частей двоичных файлов, представленных методом UUE, удаление посторонних данных заголовка так, что остаётся только закодированные в UUE данные. Фалы, передаваемые sed, должны быть переданы в правильном порядке. Версия 1 может быть введена в командную строку; версия 2 может быть исполнена в скрипте оболочки Unix

Отсортировать параграфы файла в алфавитном порядке. Параграфы разделяются пустой строкой. GNU sed использует \v для вертикального таба, или может применяться любой другой уникальный символ.

Команда 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

Оригинал: Learning Linux Commands: sed
Автор: Rares Aioanei
Дата публикации: 19 ноября 2011 года
Перевод: А. Кривошей
Дата перевода: июль 2012 г.

Николай Игнатушко проверил на GNU sed version 4.2.1 в дистрибутиве Gentoo все команды, упомянутые в этой статье. Не все скрипты хорошо отрабатывали на версии GNU sed. Но дело касалось мелочей, которые исправлены. Только скрипт по замене hill на mountains пришлось существенно переделать.

1. Введение

2. Установка

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

В моей системе эта команда показывает, что у меня установлен GNU sed 4.2.1 плюс дает ссылку на домашнюю страницу программы и другие полезные сведения. Пакет называется "sed" независимо от дистрибутива, кроме Gentoo, где он присутствует неявно.

3. Концепции

Перед тем, как идти дальше, мы считаем важным акцентировать внимание на том, что делает "sed", так как словосочетание "потоковый редактор" мало что говорит о его назначении. sed принимает на входе текст, выполняет заданные операции над каждой строкой (если не задано другое) и выводит модифицированный текст. Указанными операциями могут быть добавление, вставка, удаление или замена. Это не так просто, как выглядит: предупреждаю, что имеется большое количество опций и их комбинаций, которые могут сделать команду sed очень трудной для понимания. Поэтому мы рекомендуем вам изучить основы регулярных выражений, чтобы понимать, как это работает. Перед тем, как приступить к руководству, мы хотели бы поблагодарить Eric Pement и других за вдохновление и за то, что он сделал для всех, кто хочет изучать и использовать sed.

4. Регулярные выражения

По умолчанию sed использует stdout, вы можете использовать оператор перенаправления вывода, как показано в примере выше. Это очень простой пример, но мы проиллюстрировали несколько моментов: мы ищем все соответствия шаблону "Nick" и заменяем во всех случаях на "John". Отметим, что sed призводит поиск с учетом регистра, поэтому будьте внимательны и проверьте выходной файл, чтобы убедиться, что все замены были выполнены. Приведенный выше пример можно было записать и так:

Хорошо, скажете вы, но где же здесь регулярные выражения? Да, мы хотели сначала показать пример, а теперь начинается самая интересная часть.
Если вы не уверены, написали ли вы "nick" или "Nick", и хотите предусмотреть оба случая, необходимо использовать команду sed 's/Nick|nick/John/g'. Вертикальная черта имеет значение, которое вы должны знать, если изучали C, то есть ваше выражение будет соответствовать "nick" или "Nick". Как вы увидите ниже, канал может использоваться и другими способами, но смысл остается тот же самый. Другие операторы, широко использующиеся в регулярных выражениях - это "?", который соответствует повторению предшествующего символа ноль или один раз (то есть flavou?r будет соответствовать flavor и flavour), "*" - ноль или более раз, "+" - один или более раз. "^" соответствует началу строки, а "$" - наоборот. Если вы - пользователь vi или vim, многие вещи покажутся вам знакомыми. В конце концов, эти утилиты, вместе с awk и С уходят корнями в ранние дни UNIX. Мы не будем больше говорить на эту тему, так как проще понять значение этих символов на примерах, но вы должны знать, что существуют различные реализации регулярных выражений: POSIX, POSIX Extended, Perl, а также различные реализации нечетких регулярных выражений, гарантирующие вам головную боль.

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