Учебники

Редактор потока — специальные символы

SED предоставляет два специальных символа, которые рассматриваются как команды. Эта глава иллюстрирует использование этих двух специальных символов.

= Команда

Команда «=» имеет дело с номерами строк. Ниже приведен синтаксис команды «=»:

 [/ Шаблон /] = 
 [ADDRESS1 [, адрес2]] =

Команда = записывает номер строки и ее содержимое в стандартный поток вывода. Следующий пример иллюстрирует это.

[jerry]$ sed '=' books.txt 

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

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

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

[jerry]$ sed '1, 4=' books.txt 

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

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

Кроме того, мы можем дать команду SED печатать номера строк при успешном совпадении с образцом. В следующем примере печатается номер строки, содержащей шаблон «Пауло».

[jerry]$ sed '/Paulo/ =' books.txt 

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

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

Можете ли вы угадать, что делает следующая команда SED?

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

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

 6 

Да ты прав. Подсчитывает общее количество строк, присутствующих в файле. Давайте демистифицируем код. В разделе команд мы использовали «$ =», который печатает номер строки последней строки, за которой следует ее содержимое. Но мы также предоставили флаг -n, который подавляет печать по умолчанию буфера шаблонов. Следовательно, отображается только номер последней строки.

& Команда

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

Каждая строка в файле book.txt пронумерована. Давайте добавим слова номер книги в начале каждой строки. Следующий пример иллюстрирует это.

[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt

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

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

Этот пример очень прост. Сначала мы ищем первое вхождение цифры, которая является номером строки (именно поэтому мы использовали [[: digit:]]), и SED автоматически сохраняет сопоставленный образец в специальном символе &. На втором шаге мы вставляем слова «Номер книги» перед каждым соответствующим шаблоном, т. Е. Перед каждой строкой.

Давайте возьмем другой пример. В файле book.txt последняя цифра означает количество страниц книги. Давайте добавим «Pages =» до этого. Для этого найдите последнее вхождение цифры и замените ее на «Pages = &». Здесь & хранит соответствующий шаблон, т. Е. Количество страниц

[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt 

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

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

Пока помните, что [[: digit:]] * $ находит последнее вхождение цифры. В главе «Регулярные выражения» мы узнаем больше о регулярных выражениях.