Одной из основных операций, которые мы выполняем над любым файлом, является отображение его содержимого. Для этой цели мы можем использовать команду 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
Когда приведенный выше код будет выполнен, он даст следующий результат.