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

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

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

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

[address1[,address2]]d

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

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

[jerry]$ sed 'd' books.txt

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

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864

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

[jerry]$ sed '/Storm/,/Fellowship/d' books.txt  
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

[address1[,address2]]w file

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

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

Сделаем точную копию файла с помощью SED. Обратите внимание, что междуw и file.

[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) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 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) A Storm of Swords, George R. R. Martin, 1216 
6) A Game of Thrones, George R. R. Martin, 864

Выведем содержимое файла.

[jerry]$ cat Paulo.txt

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

3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

Выведем содержимое файла.

[jerry]$ cat Tolkien.txt

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

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432

Превосходно! Получили ожидаемый результат. SED - действительно замечательная утилита.

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

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

[address]a\ 
Append text

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
7) Adultry, Paulo Coelho, 234 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864 
7) Adultry, Paulo Coelho, 234

Помимо номера строки, мы также можем указать адрес с помощью текстового шаблона. Например, в следующем примере текст добавляется после сопоставления строкиThe Alchemist.

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 234 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
7) Adultry, Paulo Coelho, 234 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 234 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
7) Adultry, Paulo Coelho, 234 
5) The Pilgrimage, Paulo Coelho, 288 
7) Adultry, Paulo Coelho, 234 
6) A Game of Thrones, George R. R. Martin, 864

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

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

[address1[,address2]]c\ 
Replace text

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) Adultry, Paulo Coelho, 324

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

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

[address]i\ 
Insert text

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
7) Adultry, Paulo Coelho, 324 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

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

7) Adultry, Paulo Coelho, 324
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

8) Eleven Minutes, Paulo Coelho, 304' books.txt 
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage,Paulo Coelho, 288 
7) Adultry, Paulo Coelho, 324 
8) Eleven Minutes, Paulo Coelho, 304 
6) A Game of Thrones, George R. R. Martin, 864

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

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

SED предоставляет команду для перевода символов, и она представлена ​​как y. Он преобразует символы по положению. Ниже приведен синтаксис команды перевода:

[address1[,address2]]y/list-1/list-2/

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

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

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

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

I V IV XX

l команда

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

[address1[,address2]]l 
[address1[,address2]]l [len]

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

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

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

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

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

1)\tA\tStorm\tof\tSwords,George\tR.\tR.\tMartin,1216$ 
2)\tThe\tTwo\tTowers,J.\tR.\tR.\tTolkien,352$ 
3)\tThe\tAlchemist,Paulo\tCoelho,197$ 
4)\tThe\tFellowship\tof\tthe\tRing,J.\tR.\tR.\tTolkien,432$ 
5)\tThe\tPilgrimage,Paulo\tCoelho,288$ 
6)\tA\tGame\tof\tThrones,George\tR.\tR.\tMartin\t,864$

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

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

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

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

1) A Storm of Swords,Geo\ 
rge R. R. Martin,1216$ 
2) The Two Towers,J. R. \ 
R. Tolkien,352$ 
3) The Alchemist,Paulo C\ 
oelho,197$ 
4) The Fellowship of the\ 
 Ring,J. R. R. Tolkien,4\ 
32$ 
5) The Pilgrimage,Paulo \ 
Coelho,288$ 
6) A Game of Thrones,Geo\ 
rge R. R. Martin ,864$

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

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

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

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

1) A Storm of Swords,George R. R. Martin,1216$ 
2) The Two Towers,J. R. R. Tolkien,352$ 
3) The Alchemist,Paulo Coelho,197$ 
4) The Fellowship of the Ring,J. R. R. Tolkien,432$ 
5) The Pilgrimage,Paulo Coelho,288$ 
6) A Game of Thrones,George R. R. Martin,864$

Выйти из команды

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

[address]q 
[address]q [value]

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

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197

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

[jerry]$ echo $?

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

100

Прочитать команду

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

[address]r file

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

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

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

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
This is junk text. 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864

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

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

[address1[,address2]]e [command]

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Sun Sep  7 18:04:49 IST 2014 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Sun Sep  7 18:06:04 IST 2014 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
Sun Sep  7 18:06:04 IST 2014 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

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

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

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

date 
cal 
uname

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

[jerry]$ sed 'e' commands.txt

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

Sun Sep  7 18:14:20 IST 2014 
   September 2014      
Su Mo Tu We Th Fr Sa   
    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 команда.

[address1[,address2]]N

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

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

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

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

Давайте разберемся, как работает приведенный выше пример. ВNкоманда считывает первую строку, то есть «Бурю мечей», в буфер шаблона и добавляет \ n, за которым следует следующая строка. В области выкройки теперь находится Буря мечей.\nДжордж Р.Р. Мартин. На следующем этапе мы заменяем новую строку запятой.

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

[address1[,address2]]P

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

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

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

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

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

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

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

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones 
George R. R. Martin

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

[address1[,address2]]v [version]

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

[jerry]$ sed --version

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

sed (GNU sed) 4.2.2

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

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

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

sed: -e expression #1, char 7: expected newer version of sed

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

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

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

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones George R. R. Martin