Как использовать Sed в Linux

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

Основы использования Sed

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

Чтобы начать работу с sed, по нашим примерам, давайте создадим тестовый файл:

printf "hello
maketecheasier
world
this
is
wonderful
" > hello.txt

Примечание: Хотя в этом руководстве для демонстрации работы sed используется многострочный текстовый файл, все подкоманды программы будут работать и с выводом консоли.

Общая команда для sed выглядит примерно так:

sed [параметр] '{script}' [text file]

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

sed n hello.txt

Еще один базовый параметр sed – p. Как и n, она считывает данные, поступающие на вход sed, и помещает их в пространство шаблонов программы. Однако она также явно печатает их на выходе вашего терминала.

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

sed p hello.txt

Чтобы отключить это странное поведение, добавьте флаг -n перед запуском параметра:

sed -n p hello.txt

1. Выделение и обрезка текстовых потоков

Помимо печати, вы можете использовать sed для выделения и обрезки текста как из потоков данных, так и из файлов. Самый простой способ сделать это – добавить значение диапазона к параметру p.

Следующая команда использует синтаксис диапазона sed для печати с третьей по пятую строку в файле «hello.txt»:

sed -n '3,5p' hello.txt

Вы также можете использовать параметр p для печати несмежных строк в тексте. Например, следующая команда выводит первую и четвертую строки в файле «hello.txt»:

sed -n '1p; 4p' hello.txt

2. Удаление текста из потока Sed

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

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

sed -n '2d; 5d; p' hello.txt

Подобно печати строк текста, параметр d работает с многострочными диапазонами. Например, следующая команда удалит первые четыре строки из файла «hello.txt»:

sed -n '1,4d; p' hello.txt

Помимо поиска определенных диапазонов строк, вы можете использовать регулярные выражения для поиска текста, который вы хотите удалить. В этом случае sed будет искать строки, содержащие слово «world», и удалять их:

sed -n '/world/ d; p' hello.txt

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

sed -n '/world/,/wonderful/ d; p' hello.txt

3. Добавление нового текста в поток Sed

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

Чтобы добавить новую строку текста, запустите sed с параметром a, за которым следует текст, который вы хотите добавить:

sed -ne '$a hello' -e 'p' hello.txt

Примечание: Флаг -e указывает sed, что строка в кавычках после него является выражением sed. Это позволяет объединять несколько выражений в цепочку, не вызывая sed несколько раз.

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

sed -ne '$r welcome.txt' -e 'p' hello.txt

4. Поиск и замена текста в Sed

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

Начните с тестовой печати введенного текста без каких-либо изменений в sed:

sed -ne 'p' hello.txt

Замените параметр p на s, а затем добавьте после него три обратные косые черты (///):

sed -ne 's///' -e 'p' hello.txt

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

sed -ne 's/wo*.//' -e 'p' hello.txt

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

sed -ne 's/wo.*/website/' -e 'p' hello.txt

По умолчанию sed заменяет только первую строку, которая встречается в любой конкретной строке. Это может быть проблемой, если вы хотите заменить каждый экземпляр слова в текстовом потоке. Чтобы исправить это, добавьте опцию g после третьего обратного слеша в выражении:

sed -ne 's/wo.*/website/g' -e 'p' hello.txt

5. Копирование текстовых данных в пространство удержания

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

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

Чтобы начать использовать hold spaces, сначала убедитесь, что у вас есть файл, в котором есть хотя бы несколько строк текста:

sed -ne 'p' hello.txt

Замените параметр p на h, затем укажите номер строки или значение regex, которое sed будет искать в вашем файле. Это позволит sed взять определенную строку текста и скопировать ее в место для хранения:

sed -ne '3h' hello.txt

Примечание: Данные внутри пространства hold не сохраняются в разных командах sed.

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

sed -ne '3,4H; $ {x; p}' hello.txt

6. Использование меток для создания циклов в Sed

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

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

sed -e ':x' hello.txt
Укажите критерии соответствия для выражения sed. В моем случае я хочу, чтобы оно переходило в конец каждой строки моего входного текста:
sed -e ':x; $' hello.txt
Введите подкоманды sed, которые вы хотите запускать каждый раз, когда sed находит совпадение, затем заключите их в фигурные скобки. Следующая команда соединяет две соседние строки, заменяет символ новой строки пробелом, а затем возвращается к началу выражения:
sed -e ':x; /$/ {N; s/
/ /g; bx}' hello.txt


Вы даже можете расширить эту функцию, чтобы соответствовать практически любому типу входного текста. Например, следующая команда использует функцию расширенного регекса sed для удаления HTML-тегов из входного текста:

sed -re ':x; s/<[^>]*>//g; {N; bx}' hello.html
h2. 7. Внесение постоянных изменений в Sed

Как и любой другой инструмент UNIX, sed может использовать преимущества перенаправления вывода и труб. Это не только позволяет вам склеивать sed с другими программами, но и дает возможность сделать изменения постоянными.

Следующая строка кода создает новый файл «welcome.txt» из вывода моей команды sed:

sed -ne '2p; 6p' hello.txt > hi.txt


Помимо перенаправления вывода, вы также можете использовать встроенный флаг -i для редактирования текущего файла вместо вывода изменений в консоль терминала. Например, следующая команда удаляет все символы новой строки из моего текстового файла и сохраняет его:

sed -ie ':x; $; {N; s/
/ /g; bx}' hello.txt


Если весь этот разговор заставил вас заинтересоваться командной строкой Linux. Вы можете прочитать нашу предыдущую статью, где мы рассказываем о некоторых из самых интересных подсказок Bash, которые вы можете использовать сегодня.

Image credit: Morgan Richardson via Unsplash. Все изменения и скриншоты выполнены Ramces Red.

Зарубин Иван Эксперт по Linux и Windows

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

Вдохновлен www.maketecheasier.com

Похожие статьи

Комментарии (0)