Команда sed в Linux: подробное руководство.

Если вы новичок в Linux или только начинаете знакомиться с командной строкой, то команда sed наверняка вызывает интерес. Это мощный инструмент для обработки текста и автоматизации задач редактирования файлов прямо в терминале.

В этой статье мы подробно расскажем о команде sed, о том, как она работает, и приведем простые примеры использования с объяснениями.

Что такое команда sed?

sed (сокращение от stream editor — «редактор потоков») — это программа в Linux, которая позволяет выполнять автоматические преобразования текста. Она умеет искать, заменять, удалять или вставлять строки и слова внутри файла или текста, не открывая его в текстовом редакторе.

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

Как работает команда sed

Основной принцип работы sed — чтение потока текста (например, файла или вывод другой команды), применение указанных изменений и вывод результата в терминал или в другой файл.

Стандартный синтаксис команды

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

sed [опции] 'скрипт' файл

или

echo "текст" | sed 'скрипт'

Где скрипт — набор инструкций, которые sed выполнит по отношению к тексту.

Основные опции команды sed

ОпцияНазначениеПример использования
-iредактировать файл на местеsed -i ‘s/старое/новое/’ файл.txt
-eдобавить несколько командsed -e ‘s/привет/здравствуйте/’ -e ‘s/мир/земля/’ файл.txt
-nподавлять автоматическую печать, использовать только явные команды psed -n ‘s/старое/новое/p’ файл.txt
-rиспользовать расширенные регулярные выражения (в некоторых дистрибутивах -E)sed -r ‘s/[0-9]+/число/’ файл.txt

Часто используемые варианты команды sed

Как выполнять замену текста

Самое популярное использование sed — замена слова или фразы. У нас есть простой текстовый файл следующего содержания:

waky@ubuntu:~$ cat text.txt
Fuzzy Wuzzy was a bear, Fuzzy Wuzzy had no hair,
Fuzzy Wuzzy wasn't fuzzy, was he?
waky@ubuntu:~$

Заменим в нем какое-нибудь слово, например:

waky@ubuntu:~$ sed 's/Fuzzy/Furry/' text.txt
Furry Wuzzy was a bear, Fuzzy Wuzzy had no hair,
Furry Wuzzy wasn't fuzzy, was he?
waky@ubuntu:~$

Это заменит первое появление слова Fuzzy на Furry в каждой строке файла text.txt, и выведет результат в терминал, не изменяя оригинал файла.

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

waky@ubuntu:~$ sed 's/Fuzzy/Furry/g' text.txt
Furry Wuzzy was a bear, Furry Wuzzy had no hair,
Furry Wuzzy wasn't fuzzy, was he?
waky@ubuntu:~$

До этого момента, применение команды sed меняло только вывод. Сам файл оставался без изменений:

waky@ubuntu:~$ cat text.txt
Fuzzy Wuzzy was a bear, Fuzzy Wuzzy had no hair,
Fuzzy Wuzzy wasn't fuzzy, was he?
waky@ubuntu:~$

Чтобы изменить файл используйте опцию -i:

waky@ubuntu:~$ sed -i 's/Fuzzy/Furry/g' text.txt
waky@ubuntu:~$

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

waky@ubuntu:~$ cat text.txt
Furry Wuzzy was a bear, Furry Wuzzy had no hair,
Furry Wuzzy wasn't fuzzy, was he?
waky@ubuntu:~$

Теперь содержимое файла изменилось.

Замена с регулярными выражениями

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

waky@ubuntu:~$ sed -r 's/[a-z]/*/g' text.txt
F**** W**** *** * ****, F**** W**** *** ** ****,
F**** W**** ****'* *****, *** **?
waky@ubuntu:~$

Здесь [a-z] — означает любую прописную букву.

Или, в чем больше смысла, заменим все заглавные буквы прописными:

waky@ubuntu:~$ sed -r 's/[A-Z]/\L&/g' text.txt
furry wuzzy was a bear, furry wuzzy had no hair,
furry wuzzy wasn't fuzzy, was he?
waky@ubuntu:~$

Здесь [A-Z] — любая заглавная, & — элемент, совпавший с шаблоном, а \L — строчная замена.

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

Чтобы удалить все строки, содержащие слово в конце условия ставится ключ d:

waky@ubuntu:~$ sed '/hair/d' text.txt
Furry Wuzzy wasn't fuzzy, was he?
waky@ubuntu:~$ 

Из вывода была убрана первая строчка, содержащая слово hair.

Вставка и добавление строк

Допустим, нужно вставить текст после строки, содержащей определенное слово. Тогда нам поможет опция a:

waky@ubuntu:~$ sed '/Wuzzy/a\new line' text.txt
Furry Wuzzy was a bear, Furry Wuzzy had no hair,
new line
Furry Wuzzy wasn't fuzzy, was he?
new line
waky@ubuntu:~$ 

Здесь после каждой строки с Wuzzy будет добавлена строка new line.

Заключение

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

Если хотите лучше освоить sed, советуем практиковаться, комбинировать команды и изучать регулярные выражения. Это мощное оружие для автоматизации и обработки текста в Linux!