Учебники

Редактор потока — Основные команды

Эта глава описывает несколько полезных команд SED.

Удалить команду

SED предоставляет различные команды для работы с текстом. Давайте сначала рассмотрим команду удаления . Вот как вы выполняете команду удаления:

[address1[,address2]]d 

address1 и address2 — это соответственно начальный и конечный адреса, которые могут быть номерами строк или шаблонами. Оба эти адреса являются необязательными параметрами.

Как следует из названия, команда delete используется для выполнения операции удаления, и, поскольку SED работает в режиме онлайн, мы можем сказать, что эта команда используется для удаления строк. Обратите внимание, что команда delete удаляет строки только из буфера шаблонов; строка не отправляется в выходной поток, а исходный файл остается без изменений. Следующий пример иллюстрирует суть.

[jerry]$ sed 'd' books.txt 

Но где выход? Если адрес строки не указан, то SED по умолчанию работает с каждой строкой. Следовательно, он удаляет все строки из буфера шаблонов. Вот почему команда ничего не выводит на стандартный вывод.

Давайте проинструктируем SED работать только на определенных линиях. В следующем примере удаляется только 4-я строка.

[jerry]$ sed '4d' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

Кроме того, SED также принимает диапазон адресов, используя запятую (,). Мы можем дать команду SED удалить строки от N1 до N2. Например, в следующем примере удаляются все строки со 2 по 4.

[jerry]$ sed '2, 4 d' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

Диапазон адресов SED не ограничивается только номерами. Мы также можем указать шаблоны в качестве адреса. В следующем примере удаляются все книги автора Пауло Коэльо.

[jerry]$ sed '/Paulo Coelho/d' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 4) Братство Кольца, JRR Толкиен, 432 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 

Мы также можем указать диапазон адресов, используя текстовый шаблон. В следующем примере удаляются все линии между шаблонами Storm и Fellowship .

 [Джерри] $ sed '/ Storm /, / Fellowship / d' books.txt  
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 

В дополнение к этому, мы также можем использовать операторы доллара ($), плюс (+) и тильды (~) с SED.

Написать команду

Одной из важных операций, которые мы выполняем над любым файлом, является резервное копирование, т. Е. Мы делаем еще одну копию файла. SED предоставляет команду записи для хранения содержимого буфера шаблонов в файле. Ниже приведен синтаксис команды write , аналогичный команде delete .

[address1[,address2]]w file 

Здесь address1 и address2 являются соответственно начальным и конечным адресами, которые могут быть номерами строк или шаблонами. Оба эти адреса являются необязательными параметрами.

В приведенном выше синтаксисе w относится к команде записи, а file — это имя файла, в котором вы храните содержимое. Будьте осторожны с параметром файла . Когда указано имя файла, SED создает файл на лету, если он отсутствует, и перезаписывает его, если он уже существует.

Давайте сделаем точную копию файла, используя SED. Обратите внимание, что между w и файлом должен быть ровно один пробел.

[jerry]$ sed -n 'w books.bak' books.txt 

Мы создали еще один файл с именем books.bak. Теперь убедитесь, что оба файла имеют одинаковое содержимое.

[jerry]$ diff books.txt books.bak  
[jerry]$ echo $?

Выполнив приведенный выше код, вы получите следующий результат:

 0

Вы можете предположить, что команда cp делает то же самое. Да! Команда cp делает то же самое, но SED — зрелая утилита. Позволяет создать файл, содержащий только определенные строки из исходного файла. Давайте хранить только четные строки в другом файле.

[jerry]$ sed -n '2~2 w junk.txt' books.txt  
[jerry]$ cat junk.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 2) Две башни, JRR Толкиен, 352 
 4) Братство Кольца, JRR Толкиен, 432 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 

Вы также можете использовать операторы запятой (,), доллара ($) и плюс (+) с командой записи.

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

[jerry]$ sed -n -e '/Martin/ w Martin.txt' -e '/Paulo/ w Paulo.txt' -e '/Tolkien/ w 
Tolkien.txt' books.txt 

В приведенном выше примере мы сопоставляем каждую строку с шаблоном и сохраняем совпавшую строку в определенном файле. Это очень просто. Чтобы указать несколько команд, мы использовали ключ -e команды SED. Теперь давайте посмотрим, что содержит каждый файл:

[jerry]$ cat Martin.txt

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

Давайте покажем содержимое файла.

[jerry]$ cat Paulo.txt

Выполнив приведенный выше код, вы получите следующий результат:

 3) Алхимик, Пауло Коэльо, 197 
 5) Паломничество, Пауло Коэльо, 288 

Давайте покажем содержимое файла.

[jerry]$ cat Tolkien.txt

Выполнив приведенный выше код, вы получите следующий результат:

 2) Две башни, JRR Толкиен, 352 
 4) Братство Кольца, JRR Толкиен, 432 

Отлично! Мы получили ожидаемый результат. САС действительно удивительная утилита.

Добавить команду

Одной из наиболее полезных операций любого текстового редактора является предоставление функциональности добавления. SED поддерживает эту операцию с помощью команды добавления. Ниже приведен синтаксис добавления:

 [Адрес] а \ 
 Добавить текст 

Давайте добавим новую запись в книгу после строки № 4. В следующем примере показано, как это сделать.

[jerry]$ sed '4 a 7) Adultry, Paulo Coelho, 234' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 4) Братство Кольца, JRR Толкиен, 432 
 7) Взрослый, Пауло Коэльо, 234 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

В разделе команд 4 означает номер строки, a — команда добавления, а оставшаяся часть — текст, который нужно добавить.

Давайте вставим текстовую строку в конец файла. Для этого используйте $ в качестве адреса. Следующий пример иллюстрирует это:

[jerry]$ sed '$ a 7) Adultry, Paulo Coelho, 234' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 
 7) Взрослый, Пауло Коэльо, 234 

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

[jerry]$ sed '/The Alchemist/ a 7) Adultry, Paulo Coelho, 234' books.txt  

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 7) Взрослый, Пауло Коэльо, 234 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 

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

[jerry]$ sed '/The/ a 7) Adultry, Paulo Coelho, 234' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 7) Взрослый, Пауло Коэльо, 234 
 3) Алхимик, Пауло Коэльо, 197 
 7) Взрослый, Пауло Коэльо, 234 
 4) Братство Кольца, JRR Толкиен, 432 
 7) Взрослый, Пауло Коэльо, 234 
 5) Паломничество, Пауло Коэльо, 288 
 7) Взрослый, Пауло Коэльо, 234 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 

Изменить команду

SED предоставляет команду изменить или заменить, которая представлена ​​c. Эта команда помогает заменить существующую строку новым текстом. Если указан диапазон строк, все строки заменяются группой одной текстовой строкой. Ниже приведен синтаксис команды изменения:

 [Address1 [, address2]] с \ 
 Заменить текст

Заменим третью строку другим текстом.

[jerry]$ sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Взрослый, Пауло Коэльо, 324 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

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

[jerry]$ sed '/The Alchemist/ c 3) Adultry, Paulo Coelho, 324' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Взрослый, Пауло Коэльо, 324 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 

SED также позволяет заменять несколько строк одной строкой. Следующий пример удаляет строки с четвертого по шестой и заменяет их новым текстом.

[jerry]$ sed '4, 6 c 4) Adultry, Paulo Coelho, 324' books.txt  

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 4) Взрослый, Пауло Коэльо, 324

Вставить команду

Команда вставки работает так же, как и команда добавления. Единственное отличие состоит в том, что он вставляет строку перед определенной позицией. Ниже приведен синтаксис команды вставки:

 [Адрес] я \ 
 Вставить текст 

Давайте разберем команду вставки с некоторыми примерами. Следующая команда вставляет новую запись перед четвертой строкой.

[jerry]$ sed '4 i 7) Adultry, Paulo Coelho, 324' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 7) Взрослый, Пауло Коэльо, 324 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

В приведенном выше примере 4 — это номер местоположения, i подразумевает команду вставки, а оставшаяся часть — текст для вставки.

Чтобы вставить текст в начало файла, укажите адрес строки как 1 . Следующая команда иллюстрирует это:

[jerry]$ sed '1 i 7) Adultry, Paulo Coelho, 324' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 7) Взрослый, Пауло Коэльо, 324 
 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

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

[jerry]$ sed '$ i 7) Adultry, Paulo Coelho, 324

Выполнив приведенный выше код, вы получите следующий результат:

 8) Одиннадцать минут, Пауло Коэльо, 304 'books.txt 
 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 7) Взрослый, Пауло Коэльо, 324 
 8) Одиннадцать минут, Пауло Коэльо, 304 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

Обратите внимание, что вводимые записи вводятся в отдельных строках и разделяются символом обратной косой черты (\).

Команда Перевести

SED предоставляет команду для перевода символов и представляется как y . Преобразует персонажей по позиции. Ниже приведен синтаксис команды перевода:

 [Адрес1 [, адрес2]] у / список-1 / список-2 /

Обратите внимание, что перевод основан на положении символа из списка 1 для символа в той же позиции в списке 2, и оба списка должны быть явными списками символов. Регулярные выражения и классы символов не поддерживаются. Кроме того, размер списка 1 и списка 2 должен быть одинаковым.

В следующем примере арабские числа преобразуются в римские.

[jerry]$ echo "1 5 15 20" | sed 'y/151520/IVXVXX/' 

Выполнив приведенный выше код, вы получите следующий результат:

 IV IV XX 

я командую

Можете ли вы различить слова, разделенные пробелами, и слова, разделенные символами табуляции, только взглянув на них? Конечно, нет. Но САС может сделать это для вас. SED использует команду l для отображения скрытых символов в тексте. Например, символ табуляции с \ t и конец строки с символом $ . Ниже приведен синтаксис команды l .

 [ADDRESS1 [, адрес2]] л 
 [address1 [, address2]] l [len] 

Давайте создадим файл с символами табуляции для демонстрации. Для простоты мы будем использовать один и тот же файл, просто заменив пробелы символами табуляции. Подождите! Но как это сделать — открыв файл в текстовом редакторе и заменив каждый пробел знаком табуляции? Конечно, нет! Мы можем использовать команды SED для этого.

[jerry]$ sed 's/ /\t/g' books.txt > junk.txt 

Теперь давайте отобразим скрытые символы с помощью команды l :

[jerry]$ sed -n 'l' junk.txt

Выполнив приведенный выше код, вы получите следующий результат:

 1) \ TĀ \ tStorm \ TOF \ tSwords Джордж \ Tr. \ Tr. \ TMartin, 1216 $ 
 2) \ Tthe \ tTwo \ tTowers, J. \ Tr. \ Tr. \ TTolkien, 352 $ 
 3) \ Лобовое \ tAlchemist Пауло \ tCoelho, 197 $ 
 4) \ Tthe \ tFellowship \ TOF \ Шарль \ Тринг, J. \ Tr. \ Tr. \ TTolkien, 432 $ 
 5) \ Лобовое \ tPilgrimage Пауло \ tCoelho, 288 $ 
 6) \ TĀ \ tGame \ TOF \ tThrones Джордж \ Tr. \ Tr. \ TMartin \ т, 864 $

Как и другие команды SED, он также принимает номера строк и шаблоны в качестве адреса. Вы можете попробовать это сами.

Давайте внимательно рассмотрим еще одну интересную особенность САС. Мы можем дать команду SED выполнить перенос строк после определенного количества символов. Следующий пример переносит строки после 25 символов.

[jerry]$ sed -n 'l 25' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря Мечей, Гео \ 
 Rge RR Martin, 1216 $ 
 2) Две башни, JR \ 
 Р. Толкиен, 352 $ 
 3) Алхимик, Пауло С \ 
 oelho, 197 $ 
 4) Братство \ 
  Кольцо, JRR Толкиен, 4 \ 
 32 $ 
 5) Паломничество, Пауло \ 
 Коэльо, 288 $ 
 6) Игра престолов, Гео \ 
 Rge RR Martin, 864 $

Обратите внимание, что в приведенном выше примере предел переноса указывается после команды l. В данном случае это 25 символов. Эта опция специфична для GNU и может не работать с другими вариантами SED.

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

[jerry]$ sed -n 'l 0' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 $ 
 2) Две башни, JRR Толкиен, 352 $ 
 3) Алхимик, Пауло Коэльо, 197 $ 
 4) Братство Кольца, JRR Толкиен, 432 $ 
 5) Паломничество, Пауло Коэльо, 288 $ 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 $ 

Команда выхода

Команда Quit инструктирует SED выйти из текущего потока выполнения. Он представлен командой q . Ниже приведен синтаксис команды quit:

 [Адрес] д 
 [адрес] д [значение]

Обратите внимание, что команда quit не принимает диапазон адресов, она поддерживает только один адрес. По умолчанию SED выполняет чтение, выполнение и повторение рабочего процесса; но когда встречается команда quit, она просто останавливает текущее выполнение.

Давайте напечатаем первые 3 строки из файла.

[jerry]$ sed '3 q' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197

Помимо номера строки мы также можем использовать текстовые шаблоны. Следующая команда завершается при успешном сопоставлении с образцом.

[jerry]$ sed '/The Alchemist/ q' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197

В дополнение к этому, SED также может принимать значение, которое может использоваться в качестве состояния выхода. Следующая команда показывает статус выхода как 100.

[jerry]$ sed '/The Alchemist/ q 100' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197

Теперь давайте проверим статус выхода.

[jerry]$ echo $? 

Выполнив приведенный выше код, вы получите следующий результат:

 100

Команда чтения

Мы можем дать команду SED прочитать содержимое файла и отобразить его, когда определенное условие соответствует. Команда представлена ​​алфавитом r . Ниже приведен синтаксис команды чтения.

 [адрес] р файл

Обратите внимание, что между командой r и именем файла должен быть ровно один пробел.

Давайте разберемся с этим на простом примере. Создайте пример файла с именем junk.txt .

[jerry]$ echo "This is junk text." > junk.txt 

Следующая команда дает команду SED прочитать содержимое файла junk.txt и вставить его после третьей строки.

[jerry]$ sed '3 r junk.txt' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 Это ненужный текст. 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

В приведенном выше примере 3 подразумевает адрес строки, r — имя команды, а junk.txt — имя файла, содержимое которого должно отображаться. Кроме того, GNU SED также принимает диапазон адресов. Например, следующая команда вставляет содержимое файла junk.txt после третьей, четвертой и пятой строк.

[jerry]$ sed '3, 5 r junk.txt' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 Это ненужный текст. 
 4) Братство Кольца, JRR Толкиен, 432 
 Это ненужный текст. 
 5) Паломничество, Пауло Коэльо, 288 
 Это ненужный текст. 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

Как и другие команды SED, команда чтения также принимает шаблон в качестве адреса. Например, следующая команда вставляет содержимое файла junk.txt при успешном совпадении с шаблоном.

[jerry]$ sed '/Paulo/ r junk.txt' books.txt  

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 Это ненужный текст. 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 Это ненужный текст. 
 6) Игра престолов, Джордж Р. Р. Мартин, 864 

Выполнить команду

Мы можем выполнять внешние команды из SED, используя команду execute . Это представлено e . Ниже приведен синтаксис команды execute.

 [адрес1 [, адрес2]] e [команда]

Давайте проиллюстрируем команду execute на простом примере. Следующая команда SED выполняет команду даты UNIX перед третьей строкой.

[jerry]$ sed '3 e date' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 Вс 7 сентября 18:04:49 IST 2014 
 3) Алхимик, Пауло Коэльо, 197 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

Как и другие команды, он также принимает шаблоны в качестве адреса. Например, в следующем примере команда date выполняется при успешном совпадении с шаблоном. Обратите внимание, что после каждого сопоставления с шаблоном сначала выполняется команда, а затем отображается содержимое буфера шаблонов.

[jerry]$ sed '/Paulo/ e date' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 2) Две башни, JRR Толкиен, 352 
 Вс 7 сентября 18:06:04 IST 2014 
 3) Алхимик, Пауло Коэльо, 197 
 4) Братство Кольца, JRR Толкиен, 432 
 Вс 7 сентября 18:06:04 IST 2014 
 5) Паломничество, Пауло Коэльо, 288 
 6) Игра престолов, Джордж Р. Р. Мартин, 864

Если вы внимательно соблюдаете синтаксис команды e , вы заметите, что эта команда является необязательной. Если после e не указана команда , она обрабатывает содержимое буфера шаблонов как внешнюю команду. Чтобы проиллюстрировать это, давайте создадим файл commands.txt с несколькими простыми командами.

[jerry]$ echo -e "date\ncal\nuname" > commands.txt 
[jerry]$ cat commands.txt

Выполнив приведенный выше код, вы получите следующий результат:

 Дата 
 кал 
 uname

Команды из файла говорят сами за себя. В отсутствие команды после e, SED выполняет все эти команды одну за другой. Следующий простой пример иллюстрирует это.

[jerry]$ sed 'e' commands.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 Вс 7 сентября 18:14:20 IST 2014 
    Сентябрь 2014      
 Су Мо Ту Мы Чт Ср   
     1 2 3 4 5 6   
  7 8 9 10 11 12 13   
 14 15 16 17 18 19 20   
 21 22 23 24 25 26 27   
 28 29 30               
                       
 Linux 

Как и другие команды SED, команда execute также принимает все допустимые диапазоны адресов.

Разные команды

По умолчанию SED работает в одной строке, но может работать и в нескольких. Многострочные команды обозначаются заглавными буквами. Например, в отличие от команды n, команда N не очищает и не печатает пространство шаблона. Вместо этого он добавляет новую строку (\ n) в конец пространства текущего шаблона и добавляет следующую строку из входного файла в пространство текущего шаблона и продолжает стандартный поток операций SED, выполняя остальные команды SED. Ниже приведен синтаксис команды N

 [Адрес1 [, адрес2]] Н

Давайте напечатаем разделенный запятыми список названий книг и их авторов. Следующий пример иллюстрирует это.

[jerry]$ sed 'N; s/\n/, /g' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 Буря мечей, Джордж Р. Р. Мартин 
 Две башни, Дж. Р. Р. Толкиен 
 Алхимик Пауло Коэльо 
 Братство Кольца, JRR Толкиен 
 Паломничество, Пауло Коэльо 
 Игра престолов, Джордж Р. Р. Мартин

Давайте разберемся, как работает приведенный выше пример. Команда N читает первую строку, т. Е. A Storm of Swords, в буфер шаблонов и добавляет \ n, а затем следующую строку. Пространство шаблонов теперь содержит «Штурм мечей» \ n Джордж Р. Р. Мартин. На следующем шаге мы заменим символ новой строки запятой.

Как и команда p , у нас есть команда P для печати первой части (с точностью до встроенной новой строки) пространства многострочного паттерна, созданного командой N. Ниже приведен синтаксис команды P , аналогичный команде p .

 [адрес1 [, адрес2]] Р 

В предыдущем примере мы увидели, что команда N создает разделенный новой строкой список названий книг и их авторов. Напечатаем только первую его часть, т. Е. Только названия книги. Следующая команда иллюстрирует это.

[jerry]$ sed -n 'N;P' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 Буря мечей 
 Две башни 
 Алхимик 
 Братство кольца 
 Паломничество 
 Игра престолов

Обратите внимание, что при отсутствии N он ведет себя так же, как и команда p . Следующая простая команда иллюстрирует этот сценарий.

[jerry]$ sed -n 'P' books.txt

Выполнив приведенный выше код, вы получите следующий результат:

 Буря мечей 
 Джордж Р. Р. Мартин 
 Две башни 
 JRR Толкин 
 Алхимик 
 Пауло Коэльо 
 Братство кольца 
 JRR Толкин 
 Паломничество 
 Пауло Коэльо 
 Игра престолов 
 Джордж Р. Р. Мартин

В дополнение к этому, SED также предоставляет команду v, которая проверяет версию. Если указанная версия больше установленной версии SED, выполнение команды завершится неудачно. Обратите внимание, что эта опция специфична для GNU и может не работать с другими вариантами SED. Ниже приведен синтаксис команды v .

 [адрес1 [, адрес2]] v [версия]

Сначала узнайте текущую версию САС.

[jerry]$ sed --version 

Выполнив приведенный выше код, вы получите следующий результат:

 sed (GNU sed) 4.2.2 

В следующем примере версия SED больше, чем версия 4.2.2, поэтому команда SED прерывает свое выполнение.

[jerry]$ sed 'v 4.2.3' books.txt 

Выполнив приведенный выше код, вы получите следующий результат:

 sed: -e выражение # 1, char 7: ожидается более новая версия sed

Но если предоставленная версия меньше или равна версии 4.2.2, то команда работает как положено.

[jerry]$ sed 'v 4.2.2' books.txt

Выполнив приведенный выше код, вы получите следующий результат: