Редактор потока - Буфер шаблона

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

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

[jerry]$ vi 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

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

[jerry]$ sed 'p' books.txt

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

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

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

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

[jerry]$ sed -n 'p' 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

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

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

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

3) The Alchemist, Paulo Coelho, 197

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

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

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

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

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

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

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

6) A Game of Thrones, George R. R. Martin, 864

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

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

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

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

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

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

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

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

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

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

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

1) A Storm of Swords, George R. R. Martin, 1216 
3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

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

[jerry]$ sed -n '2~2 p' books.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