Linux регулярные выражения sed. Sed — Ай да Linux Wiki

Редактор потоков sed – это неинтерактивный текстовый редактор, выполняющий операции на данных, поступающих из стандартного ввода или из файла. Sed редактирует информацию построчно.

Фильтры в Linux

Фильтры — это способ получения необработанных данных, созданных другой программой или сохраненных в файле.

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

В приведенных ниже примерах мы будем предоставлять данные для этих программ с помощью файла.

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

СКРИН

Head — это программа, которая печатает первые строки ввода. По умолчанию он напечатает первые 10 строк, но мы можем изменить это с помощью аргумента командной строки.

head [-количество строк для печати] [путь]

Данная команда противоположна head. Tail — это команда, которая печатает последние строки ввода. По умолчанию он напечатает последние 10 строк, но мы можем изменить это с помощью аргумента командной строки.

tail [-количество строк для печати] [путь]

Выше было поведение tail по умолчанию. А ниже указывается заданное количество строк.

Сортировка — это красиво и просто. По умолчанию сортировка выполняется в алфавитном порядке. Между тем, существует множество параметров, позволяющих изменить механизм сортировки. Кроме того, не забудьте проверить справочную страницу, чтобы увидеть все, что он может сделать.

sort [-options] [path]

Обозначение чисел в Linux реализуется за счет команды nl.

nl [-options] [путь]

Вот еще несколько полезных опций командной строки.

В приведенном выше примере мы использовали 2 параметра командной строки. Первый -s указывает, что следует печатать после числа. С другой стороны, второй -w указывает, сколько отступов ставить перед числами. Для первого нам нужно было включить пробел как часть того, что было напечатано.

Читайте также:  Циклический оператор FOR в языке Турбо-Паскаль

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

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

Фильтры в Linux

wc [-options] [путь]

Иногда вам просто нужно одно из этих значений. -l даст нам только строки, -w даст нам слова, а -m даст нам символы.

Кроме того, Вы можете комбинировать аргументы командной строки.

Cut — это хорошая команда, которую можно использовать, если ваш контент разделен на столбцы и вам нужны только определенные поля.

Фильтры в Linux

вырезать [-опции] [путь]

В нашем примере файла у нас есть данные в 3 столбцах. Допустим, мы хотели только первый столбец.

По умолчанию cut использует символ TAB в качестве разделителя для идентификации полей. Опция -f позволяет нам указать, какое поле мы бы хотели. Если нам нужно 2 или более полей, мы разделяем их запятой, как показано ниже.

Sed расшифровывается как Stream Editor и позволяет эффективно выполнять поиск и замену наших данных. Это довольно мощная команда, но мы будем использовать ее здесь в ее базовом формате.

Фильтры в Linux

sed <выражение> [путь]

Инициал s обозначает замену и определяет действие, которое нужно выполнить. Между первой и второй косой чертой (/) мы размещаем то, что ищем. Затем между вторым и третьим слэшем, чем мы хотим его заменить.

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

uniq [опции] [путь]

Фильтры в Linux

Ребята из Linux известны своим забавным чувством юмора. Программа TAC на самом деле является CAT наоборот. Это было названо так, как это делает противоположность CAT. Получив данные, он напечатает последнюю строку первой, вплоть до первой строки.

TAC [путь]

Опции программы sed

Программа имеет на удивление мало опций. (Что несколько компенсирует избыток команд, модификаторов и прочих функций). Кроме общеизвестных опций —help (-h) и —version (-V), которые мы рассматривать не будем, их всего три:

Читайте также:  Что нового в iOS 12 получили владельцы Apple iPad

Опция -e —expression=набор_команд

Один из способов выполнения нескольких команд — применение опции -e. Например:

Sed -e «s/a/A/» -e «s/b/B/» имя_файла

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

Опция -f Если требуется выполнить большое количество команд, то удобнее записать их в файл и применить опцию -f:

Sed -f sedscript имя-файла

Sedscript здесь — имя файла, содержащего команды. Этот файл называется скриптом программы sed (далее просто скрипт). Каждая команда скрипта должна занимать отдельную строку. Например:

# комментарий — Этот скрипт изменит все строчные гласные буквы на заглавные s/a/A/g s/e/E/g s/i/I/g s/o/O/g s/u/U/g

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

Опция -n Программа sed -n не выводит ничего на стандартный выход. Чтобы получить вывод нужно специальное указание. Мы уже познакомились с модификатором /p, при помощи которого можно дать такое указание. Вспомним файл :

$ sed «s/1-9/&/p» По утрам он делал зарядку. Молния — электрический заряд.

Так как совпадений с ОБРАЗЦОМ не найдено (в файле нет цифр), то команда s с модификатором /p и знаком & в качестве ЗАМЕНЫ (напомню, что амперсанд означает сам ОБРАЗЕЦ), работает как команда cat.

Если ОБРАЗЕЦ будет найден в файле, то строки, содержащие ОБРАЗЕЦ, будут удвоены:

$ sed «s/зарядку/&/p» По утрам он делал зарядку. По утрам он делал зарядку. Молния — электрический заряд.

Теперь добавим опцию -n:

$ sed -n «s/зарядк/&/p» По утрам он делал зарядку.

Теперь наша программа работает как команда grep — возвращает только строки, содержащие ОБРАЗЕЦ.

Формат команд редактирования

Скриптовый файл состоит из набора команд:

Читайте также:  Возможности Linux

[ адрес [ , адрес ] ] команда [ аргументы ]

по одной в каждой строке. Адреса это либо номера строк, либо специальные символы, либо регулярное выражение:

$ — последняя строканачало~N — Каждая N -я строка, начиная с номера начало /регулярное_выражение/ — строки, попадающие под регулярное_выражение Примеры:

/REGEXP//REGEXP/

10,2010,+105,~N5,/REGEXP//REGEXP/

  • Если адрес не указан, обрабатываются все строки.
  • Если указан один адрес — обрабатывается соответствующая строка
  • Если указаны два адреса, то выбираются строки в заданном интервале.
  • !команда — выполняется команда , для строк, которые небыли выбраны по адресам.

Скрипты программы sed

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

В этой статье я делал акцент на использование редактора sed в командной строке, имея прицел на использование его в качестве фильтра в программных каналах (pipes). По этой причине я опустил многочисленные команды sed, применяющиеся только в его скриптах.

Существует множество любителей редактора sed, и множество статей на тему скриптописания, в том числе и в Рунете. Так что для заинтересовавшихся этой замечательной программой не составит труда пополнить свои знания.

Программа sed и символы кириллицы

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

Формат команд редактирования

Скриптовый файл состоит из набора команд:

[ адрес [ , адрес ] ] команда [ аргументы ]

по одной в каждой строке. Адреса это либо номера строк, либо специальные символы, либо регулярное выражение:

$ — последняя строканачало~N — Каждая N -я строка, начиная с номера начало /регулярное_выражение/ — строки, попадающие под регулярное_выражение Примеры:

/REGEXP//REGEXP/

10,2010,+105,~N5,/REGEXP//REGEXP/

  • Если адрес не указан, обрабатываются все строки.
  • Если указан один адрес — обрабатывается соответствующая строка
  • Если указаны два адреса, то выбираются строки в заданном интервале.
  • !команда — выполняется команда , для строк, которые небыли выбраны по адресам.