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

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

= Команда

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

[/pattern/]= 
[address1[,address2]]=

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

[jerry]$ sed '=' books.txt

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

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

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

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

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

1 
1) A Storm of Swords, George R. R. Martin, 1216 
2 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4 
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 '/Paulo/ =' books.txt

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

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

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

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

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

6

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

& Команда

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

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

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

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

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

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

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

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

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

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

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