Учебники

Редактор потока – паттерн-буфер

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

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

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

Теперь давайте распечатаем содержимое файла.

[jerry]$ sed 'p' books.txt

Когда приведенный выше код будет выполнен, он даст следующий результат.

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

Вы можете удивиться, почему каждая строка отображается дважды. Позвольте нам выяснить.

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

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

Когда приведенный выше код будет выполнен, он даст следующий результат.

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

Поздравляем! мы получили ожидаемый результат. По умолчанию SED работает на всех линиях. Но мы можем заставить SED работать только на определенных линиях. Например, в приведенном ниже примере SED работает только на 3-й строке. В этом примере мы указали диапазон адресов перед командой SED.

[jerry]$ sed -n '3p' books.txt 

Когда приведенный выше код будет выполнен, он даст следующий результат.

 3) Алхимик, Пауло Коэльо, 197 

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

[jerry]$ sed -n '2,5 p' books.txt 

Когда приведенный выше код будет выполнен, он даст следующий результат.

 2) Две башни, JRR Толкиен, 352 
 3) Алхимик, Пауло Коэльо, 197 
 4) Братство Кольца, JRR Толкиен, 432 
 5) Паломничество, Пауло Коэльо, 288

Также есть специальный символ Dollar ($), который представляет последнюю строку файла. Итак, давайте напечатаем последнюю строку файла.

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

Когда приведенный выше код будет выполнен, он даст следующий результат.

 6) Игра престолов, Джордж Р. Р. Мартин, 864 

Однако мы также можем использовать символ доллара ($) для указания диапазона адресов. Ниже пример печатает через строку 3 до последней строки.

[jerry]$ sed -n '3,$ p' books.txt 

Когда приведенный выше код будет выполнен, он даст следующий результат.

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

Мы узнали, как указать диапазон адресов с помощью оператора запятой (,). SED поддерживает еще два оператора, которые можно использовать для указания диапазона адресов. Первый – это оператор плюс (+), который можно использовать с оператором запятой (,). Например, M + n напечатает следующие n строк, начиная с номера строки M. Звучит запутанно? Давайте проверим это на простом примере. В следующем примере печатаются следующие 4 строки, начиная со строки № 2.

[jerry]$ sed -n '2,+4 p' books.txt 

Когда приведенный выше код будет выполнен, он даст следующий результат.

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

При желании мы также можем указать диапазон адресов с помощью оператора тильды (~). Он использует форму M ~ n . Это указывает на то, что SED должен начинаться с номера строки M и обрабатывать каждую n (тую) строку. Например, 50 ~ 5 соответствует строке 50, 55, 60, 65 и т. Д. Давайте печатать только нечетные строки из файла.

[jerry]$ sed -n '1~2 p' books.txt 

Когда приведенный выше код будет выполнен, он даст следующий результат.

 1) Буря мечей, Джордж Р. Р. Мартин, 1216 
 3) Алхимик, Пауло Коэльо, 197 
 5) Паломничество, Пауло Коэльо, 288

Следующий код печатает только четные строки из файла.

[jerry]$ sed -n '2~2 p' books.txt 

Когда приведенный выше код будет выполнен, он даст следующий результат.