Команда sed в Linux

Опубликовано admin - сб, 01/07/2023 - 16:00

Потоковый редактор текста SED (Stream EDitor) позволяет быстро и эффективно редактировать файлы. В Linux команда sed часто используется для замены текста.

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

Содержание

Синтаксис

sed [оции...] [скрипт] [входной_файл...]

Опции

-n, --quiet, --silent
Выключить автоматическую печать образца
    --debug
Комментировать выполнение программы
-e script, --expression=сскрипт
Добавить сскрипт в исполняемые команды
-f script-file, --file=файл-скрипта
Добавить содержимое файла-скрипта в исполняемые команды
    --follow-symlinks
Переходить по символьным ссылкам при обработке на месте
-i[СУФФИКС], --in-place[=СУФФИКС]
Править файлы на месте (создаёт копию, если указан СУФФИКС)
-l N, --line-length=N
Задать желаемую длину до переноса строки для команды l
-E, -r, --regexp-extended
Использовать в скрипте расширенные регулярные выражения (для переносимости используйте -E)
-s, --separate
Рассматривать файлы раздельно, а не в виде одного длинного непрерывного потока
-u, --unbuffered
Загружать минимальный объём данных из входных файлов и чаще сбрасывать выходные буферы на диск
-z, --null-data
Разделять строки символами NUL

Использование команды sed в Linux

Команда отображает изменения, сделанные ей, в своём выводе. Если вы желаете переписать исходный файл, то используйте опцию -i, но это не рекомендуется. Целесообразнее сохранить изменения в другом (новом) файле. Для этого перенаправьте вывод, добавив > newfilename.txt в конце команды.

Замена указанного текста

В Linux команда sed чаще всего используется для замены текста. Она ищет указанный шаблон в файле и заменяет его нужной строкой.

Для замены текста с помощью sed, используется флаг замены s и разделители (обычно косые черты - /) для разделения текстовых полей:

sed 's/old_string/new_string/' filename.txt

Замените old_string исходным текстом и new_string текстом, на который вы хотите его заменить.

Воспользуемся следующим текстом:

oleg@mobile:~/Directory:$ cat example.txt 
Мощному менеджеру пакетов pacman, поставляемому по умолчанию в дистрибутивах на основе Arch не хватает функции загрузки пакетов из пользовательского репозитория Arch (AUR). AUR — это поддерживаемый сообществом репозиторий, содержащий тысячи сторонних пакетов в виде сценариев установки, также известных как PKGBUILD.

Чтобы установить пакеты с помощью этих PKGBUILD, нам потребуется помощник AUR, такой как yay, который не предустановлен в Arch Linux и недоступен в официальных репозиториях Arch.

Конечно вы можете вручную устанавливать пакеты из AUR без использования этой утилиты, но она облегчает процесс генерирования и установки пакетов с минимальным взаимодействием с пользователем.
oleg@mobile:~/Directory:$ 

Данный текст содержит 5 строк, 2 из них являются пробельными.

Заменим AUR на Aur. На выходе отобразится изменённый текст:

oleg@mobile:~/Directory:$ sed 's/AUR/Aur/' example.txt
Мощному менеджеру пакетов pacman, поставляемому по умолчанию в дистрибутивах на основе Arch не хватает функции загрузки пакетов из пользовательского репозитория Arch (Aur). AUR — это поддерживаемый сообществом репозиторий, содержащий тысячи сторонних пакетов в виде сценариев установки, также известных как PKGBUILD.

Чтобы установить пакеты с помощью этих PKGBUILD, нам потребуется помощник Aur, такой как yay, который не предустановлен в Arch Linux и недоступен в официальных репозиториях Arch.

Конечно вы можете вручную устанавливать пакеты из Aur без использования этой утилиты, но она облегчает процесс генерирования и установки пакетов с минимальным взаимодействием с пользователем.
oleg@mobile:~/Directory:$ 

Из вывода видно, что произошла замена лишь первого вхождения искомого текста.

Замена всех вхождений указанного текста

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

Если в одной и той же строке присутствует несколько вхождений одного и того же текста, то добавив в команду флаг g можно изменить их все.

Команда для замены каждого вхождения заданного текста:

sed 's/old_string/new_string/g' filename.txt

Например, для замены всех вхождений AUR на Aur в файле example.txt вводим:

oleg@mobile:~/Directory:$ sed 's/AUR/Aur/g' example.txt
Мощному менеджеру пакетов pacman, поставляемому по умолчанию в дистрибутивах на основе Arch не хватает функции загрузки пакетов из пользовательского репозитория Arch (Aur). Aur — это поддерживаемый сообществом репозиторий, содержащий тысячи сторонних пакетов в виде сценариев установки, также известных как PKGBUILD.

Чтобы установить пакеты с помощью этих PKGBUILD, нам потребуется помощник Aur, такой как yay, который не предустановлен в Arch Linux и недоступен в официальных репозиториях Arch.

Конечно вы можете вручную устанавливать пакеты из Aur без использования этой утилиты, но она облегчает процесс генерирования и установки пакетов с минимальным взаимодействием с пользователем.
oleg@mobile:~/Directory:$ 

Вывод показывает, что команда заменила все вхождения AUR.

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

Команда sed позволяет вам выбрать, какое вхождение указанного текста вы хотите заменить в каждой строке. Для этого добавьте числовой флаг, например 1, 2, и т. д.:

sed 's/old_string/new_string/#' filename.txt

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

oleg@mobile:~/Directory:$ sed 's/Arch/ARCH/2' example.txt
Мощному менеджеру пакетов pacman, поставляемому по умолчанию в дистрибутивах на основе Arch не хватает функции загрузки пакетов из пользовательского репозитория ARCH (AUR). AUR — это поддерживаемый сообществом репозиторий, содержащий тысячи сторонних пакетов в виде сценариев установки, также известных как PKGBUILD.

Чтобы установить пакеты с помощью этих PKGBUILD, нам потребуется помощник AUR, такой как yay, который не предустановлен в Arch Linux и недоступен в официальных репозиториях ARCH.

Конечно вы можете вручную устанавливать пакеты из AUR без использования этой утилиты, но она облегчает процесс генерирования и установки пакетов с минимальным взаимодействием с пользователем.
oleg@mobile:~/Directory:$ 

Команда заменила два вхождения в первом абзаце (строке) текста и одно — во втором, пропустив первые вхождения.

Вывод только строки с замещающим текстом

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

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

sed -n 's/old_string/new_string/p' filename.txt

Опция -n отключает автоматическую печать, а флаг p предписывает sed печатать строки, в которых происходит замена.

Вы можете добавить флаг p к другим как в примере ниже:

oleg@mobile:~/Directory:$ sed -n 's/yay/YAY/1p' example.txt
Чтобы установить пакеты с помощью этих PKGBUILD, нам потребуется помощник AUR, такой как YAY, который не предустановлен в Arch Linux и недоступен в официальных репозиториях Arch.
oleg@mobile:~/Directory:$ 

Выведена была лишь строка, содержащая yay.

Замена текста с игнорированием регистра

По умолчанию команда sed чувствительна к регистру. Для игнорирования регистра при подстановке текста следует добавить флаг i в конце команды:

oleg@mobile:~/Directory:$ sed -n 's/yay/YAY/1p' example.txt
Чтобы установить пакеты с помощью этих PKGBUILD, нам потребуется помощник AUR, такой как YAY, который не предустановлен в Arch Linux и недоступен в официальных репозиториях Arch.
oleg@mobile:~/Directory:$ 

Команда изменит вхождения искомого текста, написанного в любом регистре.

Замена указанного текста в определённой строке

Для замены текста в определённой строке к флагу s вместо # добавляется номер строки в качестве префикса:

sed '# s/old_string/new_string/' filename.txt

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

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

sed '# s/old_string/new_string/' filename.txt

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

Для удаления строки из файла с помощью команды sed используется флаг d и следующий синтаксис:

sed '# s/old_string/new_string/' filename.txt

Укажите номер строки, которую вы хотите удалить, вместо символа решетки # и выполните команду.

Например, для удаления первой строки из файла example.txt введём:

oleg@mobile:~/Directory:$ sed '1d' example.txt

Чтобы установить пакеты с помощью этих PKGBUILD, нам потребуется помощник AUR, такой как yay, который не предустановлен в Arch Linux и недоступен в официальных репозиториях Arch.

Конечно вы можете вручную устанавливать пакеты из AUR без использования этой утилиты, но она облегчает процесс генерирования и установки пакетов с минимальным взаимодействием с пользователем.
oleg@mobile:~/Directory:$ 

Удаление строки в определённом диапазоне строк

Для удаления нескольких строк в диапазоне строк с помощью команды sed используется синтаксис:

sed '#,#d' filename.txt

Замените символы решетки # на начало и конец диапазона строк. Например:

oleg@mobile:~/Directory:$ sed '1,2d' example.txt
Чтобы установить пакеты с помощью этих PKGBUILD, нам потребуется помощник AUR, такой как yay, который не предустановлен в Arch Linux и недоступен в официальных репозиториях Arch.

Конечно вы можете вручную устанавливать пакеты из AUR без использования этой утилиты, но она облегчает процесс генерирования и установки пакетов с минимальным взаимодействием с пользователем.
oleg@mobile:~/Directory:$ 

Вывод показывает, что команда удалила первую строку и вторую (пробельную).

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

Для удаления строк с определённого номера строки до последней строки используется следующий синтаксис:

sed '#,$d' filename.txt

Таким образом для удаления всех строк от строки 3 до конца файла example.txt следует выполнить следующее:

oleg@mobile:~/Directory:$ sed '3,$d' example.txt
Мощному менеджеру пакетов pacman, поставляемому по умолчанию в дистрибутивах на основе Arch не хватает функции загрузки пакетов из пользовательского репозитория Arch (AUR). AUR — это поддерживаемый сообществом репозиторий, содержащий тысячи сторонних пакетов в виде сценариев установки, также известных как PKGBUILD.

oleg@mobile:~/Directory:$ 

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

Заключение

В этой статье вы ознакомились с основными приёмами использования текстового потокового редактора SED для изменения файла через командную строку. Этот редактор позволит значительно повысить продуктивность вашей работы.

Поделиться с друзьями