Утилита sed - потоковый текстовый редактор. Широко используется для работы с потоками данных в скриптах и консольных командах. Владение данной утилитой относится к основам администрирования Linux.
В общем случае работа sed задается конструкцией:
команда/вхождение/замена/флаги
Например, результатом работы команды:
echo "Сегодня 1 апреля" | sed 's/апреля/мая/'
Будет строка “Сегодня 1 мая” , в данном случае s – обозначает действие замены, далее идет вхождение и замена.
Если нужно выполнить несколько действий, то разделяем их точкой с запятой и добавляем ключ -e:
"Сегодня 1 апреля" | sed -e 's/сегодня/Завтра/i; s/апреля/мая/'
Так как мы не уверены, как именно может быть написано слово «Сегодня», то мы добавили к первому действию флаг i, который предписывает игнорировать регистр.
Пока что мы работали с потоками стандартного ввода-вывода, но также на вход можно подать файл:
's/апреля/мая/' file.txt
Тогда будут прочитаны все строки файла и в каждой из них, при совпадении будет выполнена замена. Результат будет выведен в стандартный поток вывода, исходный файл изменен не будет.
В поток вывода добавляются все строки, а не только те, которые были заменены. При необходимости можете сохранить его в отдельный файл используя перенаправление.
Другой вариант – использовать флаг w с указанием файла, но в этом случае в него будут записаны только те строки, где была произведена замена:
sed 's/апреля/мая/w out.txt' file.txt
Если нам нужно редактировать непосредственно исходный файл, то следует запустить команду с ключом -i (не следует путать с командой i):
sed -i 's/апреля/мая/' file.txt
В этом случае все замены будут произведены внутри файла, в стандартный поток вывода ничего отправляться не будет.
При работе с файлом можно указывать строки или диапазоны строк для замены, например только вторую строку:
sed '2s/апреля/мая/' file.txt
Или со 2 строки по 5:
sed '2,5s/апреля/мая/' file.txt
Для указания последней строки используйте символ $:
sed '5,$s/апреля/мая/' file.txt
Данная конструкция заменит вхождения с 5 строки по последнюю.
Если не указано иного, то sed заменят только первое вхождение в строке, номер вхождения можно указать при помощи флага или использовать флаг глобальной замены – g, при использовании данного флага с номером будут заменены все вхождения начиная с указанного, например, с третьего:
sed 's/апреля/мая/3g' file.txt
Кроме изменения строк sed можно использовать для удаления строк из потока, для этого просто укажите их номер или диапазон номеров:
sed '2,5d' file.txt
Также можно использовать вхождения, например, удалим все строки со словом «апреля»:
sed '/апреля/ d' file.txt
Можно использовать и несколько вхождений, но будьте осторожны, sed удалит все строки между ними:
sed '/апреля/,/мая/3d' file.txt
Также sed можно использовать для добавления строк в поток, в начало или конец потока, для добавления в начало используйте:
sed 'i\Это первая строка' file.txt
В конец:
sed 'a\Это последняя строка' file.txt
Или явно укажите номер строки от начала или конца:
sed '2i\Это вторая строка' file.txt
Команда с полностью заменит содержимое указанной строки:
sed '3c\Это новое содержимое третьей строки' file.txt
Еще одна возможность sed – замена символов, но при этом область замены нельзя ограничить, будет выполнена обработка всего потока, например заменим a на b, с на d и e на f:
sed 'y/ace/bdf/' file.txt
Это не полный набор приемов и возможностей sed, Телеграм накладывает ограничения на размер заметки, но уже этого достаточно для эффективного применения утилиты и получения новых навыков работы с текстом.
