Главная > Программы Команда sed LinuxВ этой статье мы рассмотрим основы использования команды sed, её синтаксис, а также синтаксис регулярных выражений, который используется непосредственно для поиска и замены в файлах. Команда sed в LinuxСначала рассмотрим синтаксис команды: # sed опции -e команды файл А вот её основные опции:
Я понимаю, что сейчас всё очень сложно, но к концу статьи всё прояснится. 1. Как работает sedТеперь нужно понять как работает команда sed. У утилиты есть два буфера, это активный буфер шаблона и дополнительный буфер. Оба изначально пусты. Программа выполняет заданные условия для каждой строки в переданном ей файле. sed читает одну строку, удаляет из неё все завершающие символы и символы новой строки и помещает её в буфер шаблона. Затем выполняются переданные в параметрах команды, с каждой командой может быть связан адрес, это своего рода условие и команда выполняется только если подходит условие. Когда всё команды будут выполнены и не указана опция -n, содержимое буфера шаблона выводится в стандартный поток вывода перед этим добавляется обратно символ перевода строки. если он был удален. Затем запускается новая итерация цикла для следующей строки. Если не используются специальные команды, например, D, то после завершения одной итерации цикла содержимое буфера шаблона удаляется. Однако содержимое предыдущей строки хранится в дополнительном буфере и его можно использовать. 2. Адреса sedКаждой команде можно передать адрес, который будет указывать на строки, для которых она будет выполнена:
Если для команды не был задан адрес, то она будет выполнена для всех строк. Если передан один адрес, команда будет выполнена только для строки по этому адресу. Также можно передать диапазон адресов. Тогда адреса разделяются запятой и команда будет выполнена для всех адресов диапазона. 3. Синтаксис регулярных выраженийВы можете использовать такие же регулярные выражения, как и для Bash и популярных языков программирования. Вот основные операторы, которые поддерживают регулярные выражения sed Linux:
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 '/^#\|^$\| *#/d' /etc/apache2/apache2.conf Под это регулярное выражение (адрес) подпадают все строки, которые начинаются с #, пустые, или начинаются с пробела, а за ним идет решетка. Регулярные выражения можно использовать и при замене. Например, заменим все вхождения p в начале строки на losst_p: # sed 's/[$p*]/losst_p/g' /etc/group Если вам надо записать результат замены в обратно в файл можно использовать стандартный оператор перенаправления вывода > или утилиту tee. Например: # sed '/^#\|^$\| *#/d' /etc/apache2/apache2.conf | sudo tee /etc/apache2/apache2.conf Также можно использовать опцию -i, тогда утилита не будет выполнять изменения в переданном ей файле: # sudo sed -i '/^#\|^$\| *#/d' /etc/apache2/apache2.conf Если надо сохранить оригинальный файл, достаточно передать опции -i в параметре расширение для файла резервной копии. Материал взят с сайта:Bash-скрипты, часть 7: sed и обработка текстов Изучаем команды Linux: sed Главная > Программы |